[英]Overloading operators '=' and '+'
我正在学习如何使用模板以及如何重载运算符。 我已经设法重载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;
}
每当我尝试编译时,都会出现这些错误:
'+':不是'A <T>'的成员
'=':不是'A <T>'的成员
'operator ='必须是非静态成员
我究竟做错了什么?
编辑:
我设法更新了代码:
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+
现在可以正常工作,但是编译器给出以下错误:
'operator ='必须是非静态成员
为什么它是静态成员,如何解决?
对于初学者,赋值运算符必须是非静态成员函数
从C ++标准(13.5.3分配)
1 赋值运算符应由具有一个参数的非静态成员函数实现 。 因为如果用户没有声明,则隐式声明了一个类的复制赋值运算符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个输入参数,即右侧操作数。 左边的操作数是调用操作符的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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.