我正在为一个c ++项目开发一个类,我必须重载所有的运算符来处理向量。具体来说,我将我的矢量定义如下:
template<class Type>
ThreeVector<Type>::ThreeVector(Type x, Type y, Type z) {
mx=x;
my=y;
mz=z;
}
我的+运营商:
template<class Type>
ThreeVector<Type> operator+(const ThreeVector<Type>& v, const//
ThreeVector<Type>& w) {
return ThreeVector<Type>(v)+=w;
}
我已经重载了+ =和 - =运算符。但是,我一直收到这个错误:
ThreeVT.cxx:12:26: error: no matching function for call to//
‘ThreeVector<double>::ThreeVector(ThreeVector<double>)’
ThreeVector<double> d=c+a;
ThreeVector.h:141:29: error: no matching function for call to
‘ThreeVector<double>::ThreeVector(const ThreeVector<double>&)’
return ThreeVector<Type>(v)+=w;
任何帮助将不胜感激!无论我做什么,这个错误似乎都会出现,而且我不知道在这种情况下它的真正意义。
答案 0 :(得分:0)
你有几个问题:
参考的功能:
ThreeVector( ThreeVector&);
ThreeVector<Type> operator=( ThreeVector&);
ThreeVector<Type> operator+=( ThreeVector&);
ThreeVector<Type> operator-=( ThreeVector&);
ThreeVector<Type> operator-( ThreeVector&);
应该使用const引用,除非它们实际更改参数:
ThreeVector(const ThreeVector&);
ThreeVector<Type> operator=(const ThreeVector&);
ThreeVector<Type> operator+=(const ThreeVector&);
ThreeVector<Type> operator-=(const ThreeVector&);
ThreeVector<Type> operator-(const ThreeVector&);
您的访问者函数是非常量的:
Type x();
Type y();
Type z();
但应该是const:
Type x() const;
Type y() const;
Type z() const;
所有这些变化都应该在类主体和函数定义中进行。
现在,您的operator+
:operator+
可以是自由函数或成员函数。无论哪种方式,你需要一个左手侧和一个右手侧。如果operator+
是成员函数,则lhs始终为this
。因此,对于二进制+函数,您的声明如下所示:
ThreeVector<Type> operator+(const ThreeVector& rhs) const;
请注意,参数由const
ref传递,函数本身为const
,因此可以在const ThreeVector
上调用。
您的代码中的实现缺少类名。它应该看起来像:
template<class Type>
ThreeVector<Type> ThreeVector<Type>::operator+(const ThreeVector<Type>& rhs) const
然后,您的函数正文可以使用this
关键字:
return ThreeVector<Type>(*this) += rhs;
关于operator + =的注释:标准约定是operator + =, - =等返回对刚更改的对象的引用。 return *this
。您的功能应如下所示:
ThreeVector<Type>& operator+=(const ThreeVector&);
答案 1 :(得分:0)
+运算符中的左参数是对象本身,由&#34; this&#34;指针。它的成员与任何其他成员函数一样。所以你的+运算符应该声明为
const ThreeVector<Type> operator+(const ThreeVector<Type>& v) const;
最后一个const意味着不改变左对象 在5 + 2中,改变5或2以产生7