我正在学习如何使用模板以及如何重载运算符。我设法超载operator[]
,但我遇到了重载operator+
和operator=
的问题。这是我的代码:
template <class T>
class A
{
public:
//...
friend A<T>& A<T>::operator+ (A<T>&, const A<T>&);
friend A<T>& A<T>::operator= (A<T>&, const A<T>&);
};
template<class T> A<T>& A<T>::operator+ (A<T>& left, const A<T>& right)
{
//some functions
return left;
}
template<class T> A<T>& A<T>::operator= (A<T>& left, const A<T>& right)
{
//some functions
return left;
}
当我尝试编译时,我得到了这些错误:
&#39; +&#39;:不是&#39; A&lt; T&gt;&#39;
&#39; =&#39;:不是&#39; A&lt; T&gt;&#39;
的成员&#39; operator =&#39;必须是非静态成员
我做错了什么?
编辑:
我设法更新了代码:
template <class T>
class A
{
public:
//...
A<T> operator+ (A<T>);
A<T> operator= (A<T>, const A<T>);
};
template<class T> A<T> A<T>::operator+ (A<T> right)
{
//some functions
return *this;
}
template<class T> A<T> operator= (A<T> right)
{
//some functions
return *this;
}
看起来operator+
现在可以正常工作,但编译器会出现此错误:
&#39;运算符=&#39;必须是非静态成员
为什么它是静态成员,我该如何解决?
答案 0 :(得分:1)
对于初学者,赋值运算符必须是非静态成员函数
来自C ++标准(13.5.3作业)
1 赋值运算符应由非静态成员实现 函数只有一个参数。因为副本分配 如果未声明,则为类隐式声明operator operator = 用户(12.8),始终隐藏基类赋值运算符 由派生类的复制赋值运算符。
其次(11.3朋友)
1班级的朋友是获得许可的功能或类别 使用类中的私有和受保护的成员名称。一类 通过朋友声明指定其朋友(如果有的话)。这样 声明给予朋友特殊的访问权限,但他们做 不要成为朋友级的指定朋友。
因此,例如这个定义
template<class T> A<T>& A<T>::operator+ (A<T>& left, const A<T>& right)
^^^^^
{
//some functions
return left;
}
不正确。至少你应该删除A<T>::
因为操作员不是该类的成员。
答案 1 :(得分:0)
作为非静态成员实现的运算符必须只接受1个输入参数,即右侧操作数。左侧操作数是调用操作符的this
对象。
作为静态成员或非成员实现的运算符必须接受2个输入参数,即左手和右手操作数。
您的operator=
被声明为具有2个输入参数的非静态成员,这是错误的。
此外,operator+
旨在返回一个新对象,该对象是一起添加的两个输入对象的副本。不要返回对正在调用运算符的对象的引用。而operator=
旨在返回对分配给的对象的引用。
试试这个:
template <class T>
class A
{
public:
//...
A<T> operator+(const A<T>&) const;
A<T>& operator=(const A<T>&);
};
template<class T> A<T> A<T>::operator+(const A<T>& right) const
{
A<T> result(*this);
//some functions to add right to result as needed...
return result;
}
template<class T> A<T>& A<T>::operator=(const A<T>& right)
{
// some functions to copy right into this...
return *this;
}