2010-08-18 74 views
2

我试图重载“+”操作符为我的课:C++超载错误+运算结果

Vector operator+(const Vector& a, const Vector& b); 

然而,它告诉我:

vector.h(12): error C2804: binary 'operator +' has too many parameters 

我真的不得到它。请帮助我

+0

您的操作员是否是班级的成员?如果是,请添加类问题的声明。 – FireAphis 2010-08-18 12:51:59

回答

10

如果您在类中定义了运算符,则它只应接收1个参数。

class Vector { 
    ... 
    Vector operator+ (const Vector& other) const { 
    Vector res = *this; 
    res += other; 
    return res; 
    } 
    ... 
}; 

如果在类定义之外定义它,则使用2参数版本。

class Vector { 
... 
}; 

Vector operator+ (const Vector& first, const Vector& second) { 
    Vector res = first; 
    res += second; 
    return res; 
} 
+1

对于第二种情况,如果不是手动复制使用按值传递的第一个参数,则如果第一个参数是临时参数,则可以让编译器有机会优化复制副本。在Vector运算符+(Vector first,Vector const&second); Vector foo(); ... a = foo()+ b;'编译器知道'foo()'调用的结果是一个临时的销毁边界,所以它可以排列代码,以便代替第一个参数到'运营商+'并且删除副本。使用您提出的签名,编译器无法避免复制该对象。 – 2010-08-18 12:17:34

1

我猜你是放置类中的代码,如果是这样的话,你只需要给1个参数(其它对象),因为默认情况下this对象是在左侧。

3

我相信你已经声明这是类Vector的成员方法。在这种情况下,它应该只有一个参数,因为调用该操作符的对象通过this指针暗示可用。 Alternalitevly,你可以声明这个函数为Vectorfriend,并带两个参数。

0

这是因为操作员左侧的矢量和右侧的矢量而不是的第一个和第二个参数。 +之前的那个实际上是this,它自动提供为Vector *。你只需要一个参数,那就是+运算符右边的Vector。

这将是正确的:

Vector operator+(const Vector& b); 

您可以通过访问离开矢量:

(* this) 

...和正确的矢量方式:

b 
0

超载当+运算符只能有一个参数。 另一个参数是 “本”

0

关注KennyTM,要不然让你充当friend ..

friend Vector operator+(const Vector& a, const Vector& b);

一个例子可以发现here ..

0

具体的错误已经在几个答案中得到了回答。成员方法的单个参数,自由函数版本的两个参数。但是没有提示你应该遵循什么路径:你应该删除第一个参数还是使它成为一个自由函数?

常见的用法是,如果您提供operator+,您可能还想提供operator+=,如果您同时提供这两种方法,则可以在后者中实施第一种。实施operator+=作为一个成员函数(完全访问所有的状态)和operator+作为一个自由函数,只需要使用公共operator+=

class MyClass { 
public: 
    MyClass& operator+=(MyClass const & rhs); 
}; 
MyClass operator+(MyClass lhs, MyClass const & rhs) { 
    return lhs+=rhs; 
} 

这种方式,你有操作单个实现,而你可以提供两种接口(a + ba += b),因此您的接口在几乎免费的情况下更为丰富。

+0

有什么理由来创建一个免费的功能?将操作符+也声明为类方法通常不是更好的OO吗? – sje397 2010-08-18 12:19:20

+0

@ sje397:自由函数运算符关于数据类型是对称的,而成员方法不可以。考虑可以从类型'T2'隐式转换的类型'T',以及来自这些类型的两个对象't'和't2'。如果'T'有一个'operator +'成员方法,那么't + t2'格式良好并且会调用该运算符,但是't2 + t'将会是一个编译时错误。通过自由函数的实现,这两个操作都是允许的,并且具有完全相同的含义 - 这可以从另外的假设中得到... – 2010-08-18 12:31:59

+0

编译器在调用成员方法之前不允许将't2'转换为'T' 'T',但允许执行该转换以匹配函数/方法的参数,如't + t2'中所示。 – 2010-08-18 12:33:59