2016-11-18 30 views
4

列挙型に変換する可能性のあるラッパーを用意したいと思います。前方宣言の問題:入れ子になった名前指定子で使用される 'enums :: Category'が不完全な型です。

基底クラスは以下の通りです:

template<typename TEnum> 
class StringConvertedEnum { 
public: 
    static std::string toString(TEnum e); 

    static TEnum toEnum(std::string &str); 

protected: 
    static const std::map<std::string, TEnum> _stringMapping; 
    static const std::map<TEnum, std::string> _enumMapping; 
}; 

そして私はこのような何かがしたい:

class Category : public StringConvertedEnum<Category::Enum> { 
public: 
    enum Enum { 
      Category1, 
      Category2, 
      OTHER 
    }; 
}; 

をただし現時点では、それは、このエラーを経由してコンパイルしていない:

incomplete type 'enums::Category' used in nested name specifier 

この問題を解決するにはどうすればよいですか?

+0

[内部クラスを宣言するにはどうすればよいですか?](http://stackoverflow.com/questions/1021793/how-do-i-forward-declare-an-inner-class) – YSC

+0

@YSC:私はそれが関連する読書だと思っていますが、正確には重複していません。 – AndyG

答えて

4

Enumがクラス内で宣言されているため、CategoryStringConvertedEnumを継承するように指定すると、その宣言の前に存在しません。これは不完全な型です、標準"3.3.2 Point of declaration [basic.scope.pdecl]"の関連部分を参照してください(コメントにこれを指摘してくれたAndyGに感謝します)。

問題を解決する最も簡単な方法は、CategoryEnumを宣言することです:

enum Enum { 
    Category1, 
    Category2, 
    OTHER 
}; 

class Category : public StringConvertedEnum<Enum> {}; 

これは、我々はC++について話している場合でも、Zen of Pythonを、次のとおりです。

Flat is better than nested.

第二の最も簡単な方法があります基本クラスを宣言する:

class BaseCategory { 
public: 
    enum Enum { 
     Category1, 
     Category2, 
     OTHER 
    }; 
}; 
class Category : public BaseCategory, public StringConvertedEnum<BaseCategory::Enum> {}; 

コメントにも指摘されているように、最新のC++を使用している場合は、scoped enumsを考慮する必要があります。

+0

+1。列挙型は不完全な型です。関連する標準: "3.3.2宣言のポイント[basic.scope.pdecl]"また、OPはスコープ付き列挙型を使用する必要があります.C++を使用しています11 – AndyG

+0

@AndyG Thxが答えに – wasthishelpful

+0

を追加しました。スコープの列挙がどのようにこの問題を解決するのに役立つのかわかりません。あなたの答えでそれを明確にするといいでしょう。 –

関連する問題