【发布时间】:2014-07-21 18:06:40
【问题描述】:
我创建了一个类,其中定义了一个枚举。我还想像这样为枚举定义一些运算符:
class MyClass
{
public:
enum MyEnum { CONSTA, CONSTB, CONSTC };
// ...
MyEnum& operator++(MyEnum& orig);
MyEnum operator++(MyEnum& orig, int);
// ...
}
对于此代码,gcc 给出以下错误消息:
.../MyClass.h|10|error: postfix ‘MyClass::MyEnum& MyClass::operator++(MyClass::MyEnum&)’ must take ‘int’ as its argument
.../MyClass.h|11|error: ‘MyClass::MyEnum MyClass::operator++(MyClass::MyEnum&, int)’ must take either zero or one argument
这意味着,编译器认为我想为 MyClass 编写一个运算符,而不是为 MyEnum。所以它希望我减少争论。
我的问题是:
一个类能否以某种方式包含除自身以外的其他事物的运算符函数(例如,对于内部类型),还是我应该将这些函数移到 MyClass 之外?
【问题讨论】:
-
只需省略运算符签名声明的
MyEnum& orig参数。 -
@πάντα ῥεῖ 如果我不够清楚:我不想为
MyClass编写运算符,我想为MyEnum编写一个运算符。我省略了MyEnum& orig参数,我将如何从函数内部引用我想要递增的枚举变量? -
试过重载非类成员运算符?
-
operator++用于类或枚举A不能是类B的成员。它可以是A类的成员(当然,不适用于枚举),也可以是命名空间范围内的非成员函数。 Working example -
@dyp
friend是命名空间范围内的非成员,真的。这是可以在课堂上定义的语法的一个怪癖。
标签: c++ class methods enums operator-overloading