[英]Getting error when overloading << operator
我有一个名为“Vector”的 Class。 它由两个私有字段组成: std::vector<double> coordinates
和int 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
在我看来,这个错误与参数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.