ロードした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]
コメントを追加