“二进制 'operator+' 参数太多

"binary 'operator+' has too many parameters

尝试使用以下代码实现运算符重载:

class Number
{
    T value;
public:
    Number(T v);
    Number();
    Number<T> operator+ (Number<T>&, const Number<T> &);
    T getValue() { return value; };
};


template <typename T>
Number<T>::Number(T val):value(val) { }

template <typename T> 
Number<T> Number<T>::operator+ (Number<T>& lhs, const Number<T> & rhs)  {    
     return lhs.value + rhs.value;
}

尝试模拟在网上找到的类似示例,但此尝试会产生多个编译器错误

所有决定:是否包含“<T>”;是否对发送和 returns 使用引用;是否使用 "const" and/or "friend";以及是否使用 "this", "new" and/or "->";搜索外部帮助已经够混乱了:)。

知道我做错了什么(很多事情)吗?

感谢您的考虑

您忘记了 隐式 this 参数 作为第一个参数出现在 non-static 成员函数.

解决您的问题,只需从 operator+ 中删除额外的第一个参数,如下所示:

template<typename T>
class Number
{
    T value;
public:
    Number(T v);
    Number();
    Number<T> operator+ (const Number<T> &);//REMOVED UNNECESSARY PARAMETER
    T getValue() { return value; };
};



template <typename T>
Number<T>::Number(T val):value(val) { }

template <typename T> 
Number<T> Number<T>::operator+ (const Number<T> & rhs)  {  //REMOVED UNNECESSARY PARAMETER  
     return value + rhs.value;//CHANGED lhs.value to value
}

可以看到程序的输出here

删除这一行:

Number<T> operator+ (Number<T>&, const Number<T> &);

并以这种方式在 class 主体之外定义 operator+:

template<typename T>
Number<T> operator+(Number<T> const& lhs, Number<T> const& rhs) {
    auto ret{ lhs };
    ret.value += rhs.value;
    return ret;
}