0

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

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

4

3 回答 3

2

在这种情况下,错误是因为operator+()是类的成员函数。Polynomial你可以做operator+()一个自由函数,在这种情况下允许你传递两个参数。因为您的函数是成员函数,这意味着它将采用三个不同的值。其中两个是你传递的,第三个是this,这是隐含的。

如果要将其保留为成员函数,则需要使该函数仅接受一个参数。第二个参数将作为this.

于 2013-10-21T15:02:05.777 回答
1

从错误消息中:

std::vector 多项式::operator+(std::vector, std::vector) [...]

我推断您声明operator +()为 class 的成员Polynomial。作为此类的成员,它必须接受零个或一个参数(如消息所述)。

当评估+p某些p类型的表达式时,将调用采用零参数的重载Polynomial。在计算具有类型和具有类型(或任何隐式可转换为它的任何内容)std::vector<term>的表达式时,使用一个类型为 的参数的重载。p + qpPolynomialqstd::vector<term>

看起来你需要这个功能

vector<term> operator+(vector<term> v1,vector<term> v2);

在任何类之外声明和定义。它可能在全局命名空间中(不建议)或包含在命名空间中term(首选)。

另外,我希望正确的声明是

vector<term> operator+(const vector<term>& v1, const vector<term>& v2);

因为在这个函数中,你(可能)不需要复制任何一个操作数来处理,你只需要读取它们。

于 2013-10-21T15:08:54.047 回答
0

从您提供的信息来看,您尝试重新定义运算符+。
让我澄清一下:在类定义中,您可以声明一个函数,它将自动分配给该类。然而,当您定义一个函数(实际上是什么重载运算符)时,您必须明确告诉您的编译器,您正在引用属于您的类的函数。范围解析运算符::就是这样做的。
所以我认为你只需要使用vector<term> **classname**::operator+(vector<term> t1, vector<term> t2)

于 2013-10-21T15:06:35.500 回答