【问题标题】:Operator overloading enum class运算符重载枚举类
【发布时间】:2017-09-13 10:10:30
【问题描述】:

我正在尝试重载枚举类的 & 运算符,但出现此编译器错误:错误:'operator&=' 不匹配(操作数类型为 'int' 和 'Numbers')。对此有何想法?

#include <iostream>
using namespace std;

enum class Numbers : int
{
    zero                    = 0, 
    one                     = 0x01,
    two                     = 0x02
};

inline int operator &(int a, Numbers b)
{
    return ((a) & static_cast<int>(b));
}

int main() {
    int a=1;
    a&=Numbers::one;
    cout << a ;
    return 0;
}

【问题讨论】:

    标签: c++ enums operator-overloading


    【解决方案1】:

    编译器准确地告诉你哪里出了问题。你没有超载&amp;=

    尽管有预期的语义,&amp;= 不会自动扩展为 a = a &amp; Numbers::one;

    如果你想两者兼得,规范的方法是通常以op= 的形式实现op。所以你原来的功能调整如下:

    inline int& operator &=(int& a, Numbers b)
    { // Note the pass by reference
        return (a &= static_cast<int>(b));
    }
    

    而新的使用它:

    inline int operator &(int a, Numbers b)
    { // Note the pass by value
        return (a &= b);
    }
    

    【讨论】:

    • 哈。我喜欢你对我给出的答案的类似看法。投赞成票。
    • @Bathsheba - 这些编译器消息太有用了:)
    • 可能是宇宙中最被忽略的文本,编译器编写者必须花费很长时间才能生成它们。他们为什么不直接说“error, innit”就完事了?
    • 或者回到 199x,模板的一个小错误会产生 2M 的输出
    • @StoryTeller:而且你没有 80 页关于共济会的文章来跋涉。
    【解决方案2】:

    很好的问题,但是您非常有用的编译器诊断会告诉您您需要知道的一切。

    您缺少 *按位 AND 赋值运算符”:operator&amp;=

    【讨论】:

      【解决方案3】:

      是的,您正在重载运算符 &amp;。但是您使用的是运算符&amp;=,这是一个不同的运算符。也重载它,你会没事的。

      【讨论】:

        猜你喜欢
        • 2011-02-04
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多