【问题标题】:enum class is not a class or namespace枚举类不是类或命名空间
【发布时间】:2014-07-24 13:38:25
【问题描述】:

我对 c++11 的枚举类功能有疑问。一个最小的代码示例是:

template<typename T>
class AClass{
public: 
enum class paramNames{
    PA = 0,
    PB,
    PC,
    NUM
};

private:
double params[paramNames::NUM];
}

当我想编译一个使用 gcc 的程序时,我收到以下错误消息:

错误:“paramNames”不是类或命名空间双参数[paramNames::NUM];

如果有人可以向我解释如何正确使用新的枚举类功能,我将不胜感激。

【问题讨论】:

    标签: c++ arrays class c++11 enums


    【解决方案1】:

    与旧的 enum 不同,没有到 int 的隐式转换。按照设计,enum class 不能隐式转换为基础类型。您可以在此处阅读有关其理由的更多信息:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf。要执行您想要的操作,您需要使用静态转换并执行以下操作:

    template<typename T>
    class AClass{
    public: 
    enum class paramNames: int{//specify the underlying type
        PA = 0,
        PB,
        PC,
        NUM
    };
    
    private:
        double params[static_cast<int>(paramNames::NUM)];
    }
    

    编辑:确保您的编译器具有可用的 c++11 语言功能,否则执行此操作会出错。

    【讨论】:

    • 虽然您的评论似乎非常有用,但当我实现您的代码时,我仍然收到相同的错误消息: enum class paramNames: int{ ^ aclass.hpp:63:33: error: 'paramNames' is not一个类或命名空间双参数[static_cast(paramNames::NUM)];
    • 你使用的是什么版本的 gcc 以及你给 gcc 的命令行参数是什么?确保您可以通过选项 -std=c++11 访问 c++11 语言功能。
    • 编译器标志起到了作用,尽管它在警告中说默认启用。非常感谢您的帮助。
    猜你喜欢
    • 2016-03-27
    • 2011-07-08
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2016-04-20
    相关资源
    最近更新 更多