私のアプリの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
キーのように大まかに機能していない理由を私は理解していません。
あなたは何を達成しようとしていますか? –
は、大きなプログラムでより強く型付けされると、プログラムの明快さ、エラーチェックの良さ、および一般的なコード保守の簡素化につながります。 – rtischer8277