所以我正在制作一个程序,它将使用多项式进行一些操作,并且我正在使用一个充满了我定义的结构的向量来表示多项式。我要做的部分是重载+, - ,*。+ =, - =和* =运算符。
term是我定义的结构。
我试图在一个类中包含所有重载方法。
我有一个文件重载它并且工作正常。该方法定义为:
vector<term> operator+(vector<term> t1, vector<term> t2)
当我尝试将其放在c ++头文件中以便在类中使用时,我收到此错误:
标题中的方法声明:
vector<term> operator+(vector<term> v1,vector<term> v2);
我得到错误:
poly.h:25:71: error: ‘std::vector<term> Polynomial::operator+(std::vector<term>, std::vector<term>)’ must take either zero or one argument
vector<term> operator+(const vector<term> v1,const vector<term> v2);
为什么它会在一个实例中起作用而不在另一个实例中?
我是c ++的新手,如果我错过任何明显的错误,请原谅。
答案 0 :(得分:2)
错误是因为operator+()
是类的成员函数,在这种情况下为Polynomial
。你可以做的是让operator+()
成为一个自由函数,在这种情况下允许你传递两个参数。
因为您的函数是成员函数,这意味着它将采用三个不同的值。其中两个是你传递的,第三个是this
,这是隐含的。
如果要将其保留为成员函数,则需要使该函数只接受一个参数。第二个参数将作为this
传递。
答案 1 :(得分:1)
从错误消息:
std :: vector Polynomial :: operator +(std :: vector,std :: vector)[...]
我推断您宣布operator +()
为班级Polynomial
的成员。作为这个类的成员,它必须采用零或一个参数(如消息所示)。
在为类型为+p
的某些p
计算表达式Polynomial
时,会调用带有零参数的重载。在评估表达式std::vector<term>
时,使用类型为p + q
的一个参数的重载,其中p
的类型为Polynomial
而q
的类型为{{1} (或隐式转换为它的任何东西)。
看起来你需要这个功能
std::vector<term>
在任何类之外声明和定义。它可能位于全局命名空间(不建议)或包含vector<term> operator+(vector<term> v1,vector<term> v2);
的命名空间内(最好)。
另外,我希望正确的声明是
term
因为在这个函数中你(可能)不需要复制任何一个操作数来处理它,你只需要读取它们的访问权。
答案 2 :(得分:0)
根据您提供的信息判断,您尝试重新定义运算符+。
让我澄清一下:在类定义内部,您可以声明一个函数,它将自动分配给该类。然而,当你定义一个函数(实际上是重载的操作符)时,你必须明确告诉你的编译器,你正在引用属于你的类的函数。范围解析运算符::
就是这样做的
所以我认为你只需要使用vector<term> **classname**::operator+(vector<term> t1, vector<term> t2)