20

我正在尝试这样的事情:

Foo & operator=(Foo & to, const Bar &from);

但我收到了这个错误:

E2239 'operator =(Foo &, const Bar &)' must be a member function

哪些运算符可以/不能定义为自由函数是否有限制,如果有,为什么?

4

2 回答 2

28

赋值运算符必须是非静态成员函数并且必须只有一个参数:

赋值运算符应由只有一个参数的非静态成员函数实现 (C++03 13.5.3/1)。

operator(), operator[], 并且operator->还必须实现为非静态成员函数。

特定于类的operator newoperator delete(及其变体)必须作为静态成员函数来实现(注意这些是隐式静态的,即使它们没有用static关键字声明)。

于 2010-06-21T20:58:35.383 回答
-1

这不可以。

我想,原因与复制构造函数有关。它们具有非常相似的语义,并且,您不能像其他构造函数一样在类之外定义复制构造函数。因此,他们不想将双胞胎分开很远(以避免双胞胎悖论:)。

PS C++ 中的遗憾是,您不能将成员添加到现有类。没有低层次的原因。如果可能的话,您可以通过不在类定义标头中声明私有函数来解耦标头和 cpp 依赖项。

于 2010-06-21T21:02:56.513 回答