2017-07-26 19 views
0

私のアプリのstd::mapのキーはintではなく、テンプレート型の非タイプのenumとして定義されています。 struct。下の最初のプログラムは、私のアプリが現在mapをどのように使っているかの概念を示しています。それはコンパイルし、OKを実行します。std :: map enumメンバを持つテンプレート構造体としてのキー

#include <map> 

template<int> 
struct NummedMap 
{ 
    typedef std::map< int, NummedMap > NumableMap; 

    NummedMap() {} 

    NumableMap numableMap; 
}; 

int main() 
{ 
    NummedMap<3> numableMap3; 
    NummedMap<4> numableMap4; 
    numableMap3.numableMap[ 3 ] = numableMap3; 
    numableMap4.numableMap[ 4 ] = numableMap4; 

    return 0; 
} 

2番目のプログラムは、私は私のアプリのmap Sをプログラムしたい方法を示していますが、私は非型テンプレートに関するいくつかの概念が欠落し、なぜ< enum EnumT >はPOD int異なっているのです。

#include <map> 

struct Enums1 // a struct containing one kind scoped enums 
{ 
    enum class Action 
    { 
    AAAA, 
    BBBB 
    }; 
}; 

struct Enums2 // a struct containing another kind scoped enums 
{ 
    enum class Action 
    { 
    CCCC, 
    DDDD 
    }; 
}; 

template< enum EnumT > 
struct EnummedMap // a struct containing a map whose key is non-type templateable 
{ 
    typedef std::map< EnumT, EnummedMap > EnumableMap; // error C2065: 'EnumT': undeclared identifier 

    EnummedMap() {} 

    EnumableMap enumableMap; 
}; 

int main() 
{ 
    EnummedMap<Enums1::Action> enummedMap1; // error C2993: illegal type for non-type template parameter 
    EnummedMap<Enums2::Action> enummedMap2; // error C2993: illegal type for non-type template parameter 
    enummedMap1.enumableMap[ Enums1::Action::AAAA ] = enummedMap1; // error C2678: binary '[': no operator found which takes a left-hand operand of type 
    enummedMap2.enumableMap[ Enums2::Action::CCCC ] = enummedMap2; // error C2678: binary '[': no operator found which takes a left-hand operand of type 

    return 0; 
} 

EnumableMapのキーが宣言されていない場合、またはなぜたとえばEnums1::Actionためintキーのように大まかに機能していない理由を私は理解していません。

+0

あなたは何を達成しようとしていますか? –

+0

は、大きなプログラムでより強く型付けされると、プログラムの明快さ、エラーチェックの良さ、および一般的なコード保守の簡素化につながります。 – rtischer8277

答えて

1
template< enum EnumT > 
struct EnummedMap // a struct containing a map whose key is non-type templateable 
{ 
    typedef std::map< EnumT, EnummedMap > EnumableMap; 

非型テンプレートパラメータ(この場合は古いスタイルの列挙型)は、単一の値である、と定義することにより、タイプではありませんが、STD ::マップがキーをタイプであることを期待します値ではありません。この作業を行うには、 "enum"を "typename"に変更してください:

template<typename EnumT > // << *** HERE *** 
struct EnummedMap // a struct containing a map whose key is non-type templateable 
{ 
    typedef std::map< EnumT, EnummedMap > EnumableMap; 
    EnummedMap() {} 

    EnumableMap enumableMap; 
}; 

ただし、非エニュムタイプが可能です。あなたが列挙型を除くすべての使用を防ぎたい場合は、static_assertを使用することができます。

#include <type_traits> 
//... 
template<typename EnumT> 
struct EnummedMap 
{ 
    static_assert(std::is_enum_v<EnumT>); // c++17 
    //static_assert(std::is_enum<EnumT>::value, ""); // c++11 

    typedef std::map< EnumT, EnummedMap > EnumableMap; 
    EnummedMap() {} 

    EnumableMap enumableMap; 
}; 

非列挙型はテンプレート引数として渡された場合、それがコンパイルされません。

関連する問題