4

次の行にエラーが表示されているアプリケーションをコンパイルしようとしています:

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.
};

それを解決する考えはありません。

4

3 に答える 3

8

スコープ列挙 ( enum class) とメンバー変数のクラス内初期化は、かなり新しい言語機能です (C++11 で導入されました)。この表によると、前者は Visual Studio 11.0 以降が必要で、後者はまだサポートされていません。

コンパイラがスコープ付き列挙をサポートしていない場合、唯一のオプションは を削除することclassです。より広い汚染を引き起こしたくない場合は、クラスまたは名前空間内でスコープを設定することを検討してください。

クラス内の初期化をサポートしていない場合は、コンストラクターで昔ながらの方法でそれを行う必要があります。ただし、メンバーは唯一のコンストラクターによって初期化されるため、ここでそれを使用しても意味がありません。を取り除くだけ= 0です。

于 2013-11-07T09:31:19.843 に答える
0

定義でのC++ 11の使用に関する質問については、宣言した場所と同じ場所でクラスメンバーを初期化しようとしているとenum class説明しているコードで、それは不可能です(C++ 11では不可能です)、静的クラスメンバーのみそのように初期化することが許可されています。取り外してOKです。HolePixelValueWrapperValue= 0

ゼロへの初期化を続けたい場合はValue、コンストラクターのパラメーターにデフォルトで値を持たせることができます (もちろん、それが設計を壊していない場合):

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

于 2013-11-07T09:31:10.707 に答える