【问题标题】:A class cannot contain operator functions for an inner defined enum?一个类不能包含内部定义枚举的运算符函数?
【发布时间】: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


【解决方案1】:

您可以使用全局运算符重载来做到这一点

class MyClass
{
    public:
        enum MyEnum { CONSTA, CONSTB, CONSTC };
};

MyClass::MyEnum& operator++(MyClass::MyEnum& orig) { return ++orig; }
MyClass::MyEnum operator++(MyClass::MyEnum& orig, int) 
    { MyClass::MyEnum temp = orig++; return temp; }

查看可编译代码here please

【讨论】:

  • 只是让它们成为朋友函数也可以。
  • @dyp 我认为没有必要,因为MyEnum 是公开的,否则几乎无用。
  • 这基本上是 Sean Parent 使用的论点:您可以(ab)使用友元函数在类中定义函数。
  • @dyp 你能提供一些链接来启发我吗?我对当前的 c++11 传道者没有那么高;)
  • 我认为他在 2013 年的 GoingNative 中提到了它 - 无论是在他的两次演讲中的一次还是在问答小组中。我会试着找出我在哪里捡到这个的。
猜你喜欢
  • 2019-12-14
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 2011-01-28
相关资源
最近更新 更多