C ++のクラステンプレートに、特殊化されていない共通の静的メンバーを含めることは可能ですか?

dvilela

ロードしたjson構成ファイルの変数に従ってインスタンス化するクラステンプレートがあるとします。そのjsonファイルでは、変数は次のようになります:"TYPEA"または"TYPEB"

また、可能なすべてのタイプを格納する列挙型があるので、ケースを切り替えて、ある専門分野を具体化することができます。ここで、この列挙型を構成ファイルの対応する値と相関させるstd :: mapが必要です。たとえば、次のようになります{"TYPEA" = TYPEA, "TYPEB" = TYPEB}

文字列を読み込んだ後、それが有効な値であるかどうかを確認したいので、マップを検索し、キーが存在しない場合は例外をスローします。キーが存在する場合は、列挙型を切り替えて、適切なテンプレートの特殊化をインスタンス化します。

これはstatic std::mapすべて、すべての専門分野に共通を持っていることを意味します。これは可能ですか、それともこれを行う愚かな方法ですか?ヘッダーまたはtppファイルで定義する必要がありますか?マップの定義に問題があります。

#include <iostream>
#include <map>

template <typename T>
class A
{
    public:

        T m_t;
        enum classType{TYPEA, TYPEB, TYPEC};
        static std::map<std::string, classType> m_typeMap;
        classType m_type;

        A(T& t) : m_t(t) {}
};


template <typename T>
std::map<std::string, A<T>::classType> A<T>::m_typeMap =   // here I get the error
{{"TYPEA", A::classType::TYPEA},
 {"TYPEB", A::classType::TYPEB},
 {"TYPEC", A::classType::TYPEC}};


int main()
{
    std::cout << A::m_typeMap["TYPEA"] << std::endl;
}

コンパイラエラーは次のとおりです。

../main.cpp:19:38: error: type/value mismatch at argument 2 in template parameter list for 'template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map'
 std::map<std::string, A<T>::classType> A<T>::m_typeMap =
                                      ^
../main.cpp:19:38: note:   expected a type, got 'A<T>::classType'
../main.cpp:19:38: error: template argument 4 is invalid
../main.cpp:19:46: error: conflicting declaration 'int A<T>::m_typeMap'
 std::map<std::string, A<T>::classType> A<T>::m_typeMap =
                                              ^~~~~~~~~
../main.cpp:11:49: note: previous declaration as 'std::map<std::__cxx11::basic_string<char>, A<T>::classType> A<T>::m_typeMap'
         static std::map<std::string, classType> m_typeMap;
                                                 ^~~~~~~~~
../main.cpp:19:46: error: declaration of 'std::map<std::__cxx11::basic_string<char>, A<T>::classType> A<T>::m_typeMap' outside of class is not definition [-fpermissive]
 std::map<std::string, A<T>::classType> A<T>::m_typeMap =
                                              ^~~~~~~~~
../main.cpp: In function 'int main()':
../main.cpp:27:18: error: 'template<class T> class A' used without template parameters
     std::cout << A::m_typeMap["TYPEA"] << std::endl;
テッド・リンモ

C ++のテンプレートクラスに、特殊化されていない共通の静的メンバーを含めることは可能ですか?

その「クラステンプレート」を作成すると、実際の内容がわかりやすくなります。

クラステンプレートを共通ベースから継承させると、確かに可能です。

struct base { // non-template base
    // static functions and variables 
};

template<typename T>
class Foo : public base {}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C ++-テンプレートクラスの特殊化に一般的なテンプレートのコードを含める方法はありますか?

分類Dev

C ++「新しい」タイプのテンプレートを特殊化するときに、コンストラクターパラメーターを事前定義するにはどうすればよいですか。

分類Dev

すべてを再実装することなく、c ++クラステンプレートの特殊化

分類Dev

C ++が完全な特殊化によってマスクされている基本テンプレート関数をインスタンス化するのはなぜですか?

分類Dev

C ++テンプレートでメンバー関数を部分的に特殊化できないのはなぜですか

分類Dev

派生クラスのメンバー関数ポインターをパラメーターとして渡すときに、C ++の誤ったテンプレートの特殊化が選択されました

分類Dev

C ++テンプレートの特殊化に基本クラスを追加する

分類Dev

C ++テンプレートの特殊化に基本クラスを追加する

分類Dev

C ++の明示的な特殊化はprimayテンプレートメンバーにアクセスできませんが、部分的な特殊化メンバーにはアクセスできますか?

分類Dev

C ++テンプレートの特殊化と定数を理解していない

分類Dev

c ++ 14テンプレートの特殊化「使用されているが定義されていない」

分類Dev

C ++ 1zでフレンドテンプレートクラステンプレートを宣言するとエラーが発生します:「template <classT> classA」の特殊化は名前空間に表示される必要があります

分類Dev

クラステンプレートの明示的な特殊化の定義は、C ++のどこに配置する必要がありますか?

分類Dev

SFINAEを使用したC ++ 11テンプレート関数の特殊化により、さらに特殊化できます(エラー:オーバーロードされた関数の呼び出しがあいまいです)

分類Dev

C ++テンプレートの部分的な特殊化-unique_ptr <t>で最も特殊化されています

分類Dev

C ++で、クラス内のコピー不可能な静的メンバー変数を初期化するにはどうすればよいですか?

分類Dev

複数のパラメーターに対するC ++部分クラステンプレートの特殊化

分類Dev

C ++の特殊なテンプレートクラスのテンプレートクラスメンバーフィールドにアクセスするにはどうすればよいですか?

分類Dev

配列を受け入れるC ++テンプレートが、ポインター(bis)を受け入れる1つよりも特殊化されていないのはなぜですか?

分類Dev

パラメーターC ++のタイプによってオーバーロードされたコンストラクターを特殊化します

分類Dev

C ++のデフォルト引数でテンプレートパラメータをスキップすることは本当に不可能ですか、なぜ構文はそうではないことを示唆していますか?

分類Dev

C ++でテンプレートクラスにパラメータとして渡される基本クラスのメソッドをオーバーロードするにはどうすればよいですか?

分類Dev

最終的に実行されないc ++テンプレート関数の一部でエラーを回避することは可能ですか?

分類Dev

C ++ 14で自動戻り値の型を使用して明示的なテンプレートの特殊化を行うことは有効ですか?

分類Dev

C ++ 11では、戻り値の型に基づいて関数オブジェクトを受け取る関数テンプレートを特殊化するにはどうすればよいですか?

分類Dev

C ++ :(重複していない)クラス内で初期化された(宣言されただけではない)統合静的メンバーがリンカーエラーを引き起こすのはなぜですか?

分類Dev

C ++では、テンプレート関数が部分的な特殊化を持てないのはなぜですか?

分類Dev

推定クラス型のプレースホルダーで型が指定されている非型テンプレート引数をC ++ 2aの別のテンプレートに渡すことはできますか?

分類Dev

sizeof(type)==定数を比較するとC ++テンプレートの特殊化が機能しない

Related 関連記事

  1. 1

    C ++-テンプレートクラスの特殊化に一般的なテンプレートのコードを含める方法はありますか?

  2. 2

    C ++「新しい」タイプのテンプレートを特殊化するときに、コンストラクターパラメーターを事前定義するにはどうすればよいですか。

  3. 3

    すべてを再実装することなく、c ++クラステンプレートの特殊化

  4. 4

    C ++が完全な特殊化によってマスクされている基本テンプレート関数をインスタンス化するのはなぜですか?

  5. 5

    C ++テンプレートでメンバー関数を部分的に特殊化できないのはなぜですか

  6. 6

    派生クラスのメンバー関数ポインターをパラメーターとして渡すときに、C ++の誤ったテンプレートの特殊化が選択されました

  7. 7

    C ++テンプレートの特殊化に基本クラスを追加する

  8. 8

    C ++テンプレートの特殊化に基本クラスを追加する

  9. 9

    C ++の明示的な特殊化はprimayテンプレートメンバーにアクセスできませんが、部分的な特殊化メンバーにはアクセスできますか?

  10. 10

    C ++テンプレートの特殊化と定数を理解していない

  11. 11

    c ++ 14テンプレートの特殊化「使用されているが定義されていない」

  12. 12

    C ++ 1zでフレンドテンプレートクラステンプレートを宣言するとエラーが発生します:「template <classT> classA」の特殊化は名前空間に表示される必要があります

  13. 13

    クラステンプレートの明示的な特殊化の定義は、C ++のどこに配置する必要がありますか?

  14. 14

    SFINAEを使用したC ++ 11テンプレート関数の特殊化により、さらに特殊化できます(エラー:オーバーロードされた関数の呼び出しがあいまいです)

  15. 15

    C ++テンプレートの部分的な特殊化-unique_ptr <t>で最も特殊化されています

  16. 16

    C ++で、クラス内のコピー不可能な静的メンバー変数を初期化するにはどうすればよいですか?

  17. 17

    複数のパラメーターに対するC ++部分クラステンプレートの特殊化

  18. 18

    C ++の特殊なテンプレートクラスのテンプレートクラスメンバーフィールドにアクセスするにはどうすればよいですか?

  19. 19

    配列を受け入れるC ++テンプレートが、ポインター(bis)を受け入れる1つよりも特殊化されていないのはなぜですか?

  20. 20

    パラメーターC ++のタイプによってオーバーロードされたコンストラクターを特殊化します

  21. 21

    C ++のデフォルト引数でテンプレートパラメータをスキップすることは本当に不可能ですか、なぜ構文はそうではないことを示唆していますか?

  22. 22

    C ++でテンプレートクラスにパラメータとして渡される基本クラスのメソッドをオーバーロードするにはどうすればよいですか?

  23. 23

    最終的に実行されないc ++テンプレート関数の一部でエラーを回避することは可能ですか?

  24. 24

    C ++ 14で自動戻り値の型を使用して明示的なテンプレートの特殊化を行うことは有効ですか?

  25. 25

    C ++ 11では、戻り値の型に基づいて関数オブジェクトを受け取る関数テンプレートを特殊化するにはどうすればよいですか?

  26. 26

    C ++ :(重複していない)クラス内で初期化された(宣言されただけではない)統合静的メンバーがリンカーエラーを引き起こすのはなぜですか?

  27. 27

    C ++では、テンプレート関数が部分的な特殊化を持てないのはなぜですか?

  28. 28

    推定クラス型のプレースホルダーで型が指定されている非型テンプレート引数をC ++ 2aの別のテンプレートに渡すことはできますか?

  29. 29

    sizeof(type)==定数を比較するとC ++テンプレートの特殊化が機能しない

ホットタグ

アーカイブ