繁体   English   中英

重载 << 运算符时出错

[英]Getting error when overloading << operator

我有一个名为“Vector”的 Class。 它由两个私有字段组成: std::vector<double> coordinatesint len 方法dim()返回len

我正在重载运算符<<像这样:

friend std::ostream& operator<<(std::ostream& os,  Vector& vec ) 
{
    std:: cout << "(";
    for ( int i = 0; i < vec.dim(); i++ ) {
        if ( i != vec.dim()-1){
            os << vec[i] << ", ";
        } else {
            os << vec[i];
        }
    }
    os << ')';
    return os;
}

像这样的运算符+

friend Vector operator +(Vector& first, Vector& second)
{
    if(first.dim() != second.dim()){
        throw std::length_error{"Vectors must be the same size"};
    }else {
        Vector localVec(first.dim()); // same as {0,0,0...,0} - first.dim() times 
        for (int i = 0; i < first.dim(); i++){
            localVec[i] = first[i] + second[i];
        }
        return localVec;
    }
}

像这样的运算符[]

double& operator[](int index)
{
    return this->coordinates[index];
}

这就是问题所在:

Vector x{1,2,4};
Vector y{1,2,3};
    
Vector z = x + y; 
std:: cout << z; // it works perfectly fine - (2, 4, 7)

std:: cout << x + y; // it gives me an error 
  • 无法匹配 'unique_ptr<type-parameter-0-2, type-parameter-0-3>' 与 'Vector' 运算符<<(basic_ostream<_CharT, _Traits>& __os, unique_ptr<_Yp, _Dp> const& __p)

在我看来,这个错误与参数Vector& vec有关,但我不知道它是否正确以及我应该怎么做才能修复它。 如果有人可以给我一个提示(或告诉我应该阅读更多内容) - 我将非常感激。

这是完整的代码:

 class Vector
{
    private:
        std::vector <double> coordinates;
        int len;
    public:
        Vector(): len{0}, coordinates{} {};
        Vector(std::initializer_list <double> coordinates_): len{static_cast <int>( coordinates_.size())}, coordinates{coordinates_} {}
        Vector(int len) : len{len} {
            for(int i = 0; i < len; i++){
                coordinates.push_back(0);
            }
        }
        int dim() const
        {
            return this->len;
        }

        double& operator[](int index)
        {
            return this->coordinates[index];
        }

        friend std::ostream& operator<<(std::ostream& os,  Vector& vec ) 
        {
            std:: cout << "(";
            for ( int i = 0; i < vec.dim(); i++ ) {
                if ( i != vec.dim()-1){
                    os << vec[i] << ", ";
                } else {
                    os << vec[i];
                }
            }
            os << ')';
            return os;
        }

        friend Vector operator +(Vector& first, Vector& second)
        {
            if(first.dim() != second.dim()){
                throw std::length_error{"Vectors must be the same size"};
            }else {
                Vector localVec(first.dim());
                for (int i = 0; i < first.dim(); i++){
                    localVec[i] = first[i] + second[i];
                }
                return localVec;
            }
        }
};

friend std::ostream& operator<<(std::ostream& os, Vector& vec)

此签名不接受右值,这就是您的临时结果在此处发生错误的原因:

std:: cout << x + y;

将第二个参数更改为const Vector& vec或提供带有 r 值参考参数的重载。

friend std::ostream& operator<<(std::ostream& os, const Vector& vec);

临时不能绑定到非常量引用参数。 您至少在两个地方缺少const 最重要的是这里:

friend std::ostream& operator<<(std::ostream& os, const Vector& vec ) 
                                                // ^^ 

并且应该有operator[]const重载

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM