【问题标题】:Enum error: 'enum' : missing tag name枚举错误:“枚举”:缺少标签名称
【发布时间】:2013-11-18 20:53:51
【问题描述】:

我正在尝试编译在以下行中显示错误的应用程序:

enum class HoleMaskPixelTypeEnum {HOLE, VALID, UNDETERMINED};

我没有使用 enum 和 class 关键字这样的方式。如果我评论关键字类,则会发生以下错误

error C2864: 'HolePixelValueWrapper<T>::Value' : only static const integral data members can be initialized within a class

代码如下:

 template <typename T>
struct HolePixelValueWrapper
{
  HolePixelValueWrapper(const T value) : Value(value){}

  operator T()
  {
    return this->Value;
  }

  T Value = 0;//error here.
};

不知道怎么解决。

【问题讨论】:

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


    【解决方案1】:

    作用域枚举 (enum class) 和成员变量的类内初始化是一种相当新的语言特性(在 C++11 中引入);根据this table的说法,前者需要Visual Studio 11.0或更高版本,后者暂不支持。

    如果您的编译器不支持作用域枚举,那么唯一的选择是删除class。如果您不想造成更广泛的污染,您可以考虑将其范围限定在类或命名空间中。

    如果它不支持类内初始化,那么您只需要在构造函数中以老式方式进行即可。但是,无论如何在这里使用它是没有意义的,因为该成员是由唯一的构造函数初始化的。只需删除= 0

    【讨论】:

      【解决方案2】:

      enum class Blah 是 C++11 功能。你是用 C++11 编译器编译的吗?

      【讨论】:

      • 哦不!我正在使用 MSVC 15.0.30729.1,但不知道如何检查其 c++11 功能。我认为这不是导致错误的原因。
      【解决方案3】:

      关于在 enum class 定义中使用 C++11 的问题,在描述 HolePixelValueWrapper 的代码中,您正试图在声明它的同一位置初始化类成员 Value,这是不可能的(不在 C++11 中),只允许像这样初始化静态类成员。去掉= 0就OK了。

      如果您想继续将Value 初始化为零,您可以让构造函数的参数默认具有值,就像这样(当然,如果它不破坏您的设计):

      HolePixelValueWrapper(const T value = 0) : Value(value){}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多