在c ++头文件中声明重载运算符时遇到问题

时间:2013-10-21 14:52:12

标签: c++ class vector struct header

所以我正在制作一个程序,它将使用多项式进行一些操作,并且我正在使用一个充满了我定义的结构的向量来表示多项式。我要做的部分是重载+, - ,*。+ =, - =和* =运算符。

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 ++的新手,如果我错过任何明显的错误,请原谅。

3 个答案:

答案 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的类型为Polynomialq的类型为{{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)