我对朋友操作员重载感到困惑。如果我在头文件中编写友元运算符重载函数没有问题,但是一旦我将函数移动到类文件,它就会给我以下错误。我搜索了一些样本,他们都在头文件中写了这个函数。我做错了什么?感谢。
...: error: expected ‘,’ or ‘...’ before ‘&’ token
...: error: ISO C++ forbids declaration of ‘statisticain’ with no type
...: error: ‘main_savitch_2C::statistician operator+(int)’ must have an argument of class or enumerated type
// a.h
class A
{
public:
friend A operator + (const A &a1, const A &a2);
};
// a.cpp
#include "a.h"
A operator + (const A &a1, const A &a2)
{
//
}
答案 0 :(得分:3)
从您收到的错误消息:
ISO C++ forbids declaration of ‘statisticain’ with no type
我认为你通过倒转最后两个字母拼错了“统计学家”(注意你有“statisticain”而不是“统计学家”。)
这与标题或.cpp文件中是否实现operator+
无关。
答案 1 :(得分:1)
我同意之前的回答。另外,如果我可能会问,当两个参数和返回类型属于同一个类时,为什么要将函数设为friend
?为什么不让它成为成员,所以第一个参数由this
运算符隐式传递?
答案 2 :(得分:0)
将两个param版本移出类声明。或者只使用一个param和this指针。
这是一个缩写的现实世界的例子。
//complexnumber.h
class ComplexNumber
{
float _r;
float _i;
friend ComplexNumber operator+(const ComplexNumber&, const ComplexNumber&);
public:
ComplexNumber(float real, float img):_r(real),_i(img) {}
ComplexNumber& operator + (const ComplexNumber &other);
};
ComplexNumber operator+(const ComplexNumber &c1, const ComplexNumber& c2);
//complexnumber.h
ComplexNumber operator+(const ComplexNumber &c1, const ComplexNumber& c2)
{
return ComplexNumber(c1._r+c2._r, c1._i+c2._i);
}
// static
ComplexNumber& ComplexNumber::operator + (const ComplexNumber &other)
{
this->_r = this->_r + other._r;
this->_i = this->_i + other._i;
return *this;
}