重载运算符' ='和' +'

时间:2016-11-23 17:29:52

标签: c++ operators overloading

我正在学习如何使用模板以及如何重载运算符。我设法超载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;必须是非静态成员

为什么它是静态成员,我该如何解决?

2 个答案:

答案 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;
}