【问题标题】:why I can use operation on enumerated type为什么我可以对枚举类型使用操作
【发布时间】:2020-05-22 07:27:33
【问题描述】:

我有这段代码会导致编译器错误提示:

Error (active)  E0511   this operation on an enumerated type requires an applicable user-defined operator function
enum e{ val = 201, val2 = 11 };
    for (unsigned bit = 1; e::val; e::val /= e::val2, bit <<= 1) {
        std::cout << bit << std::endl;

为什么我不能做这个操作,枚举的类型是整数

【问题讨论】:

  • 您正在尝试修改常量值。这回答了你的问题了吗? stackoverflow.com/questions/10305315/…
  • 好的,谢谢!那么如何处理幻数呢?为了避免幻数,我可以使用什么?
  • 你给他们一个名字。你的枚举和201 btw 一样神奇。试试const int some_meaningful_name = 201;
  • 你把事情搞混了。如果201 只是一个名为val 的变量的初始化器,那么没有什么神奇的,而且你也不需要枚举。如果您添加一两行关于您实际想要实现的目标,也许会很好。
  • 嗯?警告只是警告。如果这是一个错误,你应该重新配置 clang,因为它不应该是一个错误。我并不是说 Clang 不正确,一点也不。我很欣赏它的警告,考虑一下,并决定保留代码原样。 (我会将m_n 和m_d 的定义放在不同的行上,但那是另一回事)

标签: c++


【解决方案1】:

正如 DNT 在 cmets 中已经指出的那样,一个问题是,您尝试修改一个常量值。

另一个问题是枚举中元素的类型是e 而不是int。见c++ reference。 对于e 类型,您必须重载operator/=。如果你想使用int的操作符,你可以这样做:

#include <iostream>

enum e{ val = 201, val2 = 11 };

int main()
{
    int eval = e::val;
    for (unsigned bit = 1; eval; eval /= e::val2, bit <<= 1) {
        std::cout << bit << std::endl;
    }
}

【讨论】:

  • 只是一个小错字:不是operator \=,而是operator /=。
  • @pqans 已修复。谢谢你的提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多