【问题标题】:Defining operators for enums nested within a class为嵌套在类中的枚举定义运算符
【发布时间】:2015-11-17 01:23:55
【问题描述】:

说我有这个:

class Example {
    enum class E { elem1, elem2 };
    E& operator++(E& e) {
        // do things
    }
};

似乎很有意义,我什至看到它在 other questions 中使用,但编译器告诉我参数只能为空或 int。

这在普通类中是有道理的,但是当我没有 this 值时,我到底应该做什么?

【问题讨论】:

  • 这个问题还不是很清楚,你能不能用Coliru或者Wandbox复现一个活生生的例子,并产生一个活生生的例子。
  • @ShafikYaghmour ideone.com/tEmYxD 这基本上就是问题所在,但带有相关的错误消息。
  • 那是不正确的,运算符是为类Example,如果你拿走包装类然后it works fine。返回对局部变量的引用也是未定义的行为。
  • 我知道如果去掉包装类它工作得很好,但我正在尝试为该类中的枚举定义一个运算符——我不明白为什么它不能完毕。修复了局部变量的问题,谢谢。
  • 在类外定义like so

标签: c++ enums operator-overloading


【解决方案1】:

您在类中定义的运算符适用于类Example,因此具有E& 的参数和返回类型是不正确的,编译器会告诉您。

标准告诉我们:

操作符函数要么是非静态成员函数,要么是非成员函数[...]

它不能是E 的非静态成员函数,因此它必须是非成员函数。

您可以在Example 之外定义运算符,如下所示:

Example::E& operator++(Example::E& e) {
    // modify e
    return e ;
}

【讨论】:

    【解决方案2】:

    正如@Shafik 回答的那样,您可以为仅在类内部声明为非成员函数的枚举声明运算符,如下所示:

    class Example 
    {
    public:
        enum class Element
        { 
            Element1, 
            Element2
        };
    };
    
    Example::Element operator++(Example::Element element)
    {
         // do things
    }
    

    有一个很好的post 关于实现枚举的增量运算符。希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 2020-11-13
      • 2017-09-05
      • 2018-11-20
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多