我已经找到了很多关于这个错误的讨论,但到目前为止我没有尝试过任何工作。
基本上我正在使用动态数组创建一个模板矢量类,但是当我尝试重载“+”运算符时,它只适用于2个加数(v3 = v1 + v2),当我尝试3个加数时(v4 = v1 + v2 + v3),它返回最后一个加数(v3)。我发现这是因为当第二次调用重载+运算符的函数时,第一个加数的指针值为0xcccccccc。这意味着它可能会对不再存在的东西产生兴趣。但是,我不知道如何从重载函数返回向量对象。这是我尝试过的,但这些都不起作用:
//this works only for two addends
template <class T> Vector<T>& operator+(Vector<T>& v1, Vector<T>& v2)
{
Vector<T> v;
//calculations
return v;
};
//this causes above mentioned error
template <class T> Vector<T> operator+(Vector<T>& v1, Vector<T>& v2)
{
Vector<T> v;
//calculations
return v;
};
//this causes above mentioned error too
template <class T> Vector<T> operator+(Vector<T>& v1, Vector<T>& v2)
{
Vector<T>* v= new Vector<T>;
//calculations
return (*v);
};
任何想法如何返回矢量对象,以便它也适用于3个加数?
答案 0 :(得分:9)
您需要使用const
引用,以便它们可以绑定到临时对象:
template <class T>
Vector<T> operator+(const Vector<T>& v1, const Vector<T>& v2)
{
Vector<T> tmp = v1;
tmp += v2;
return tmp;
}
如果您的类型可以有效移动,您可以使用右值参考oveloads来利用它:
template <class T>
Vector<T> operator+(Vector<T>&& v1, Vector<T>&& v2)
{
Vector<T> tmp = std::move(v1);
tmp += v2;
return tmp;
}
显然,您不应该返回引用或需要被调用者删除的内容。