7

を専門にすることができ、私は以下のコードでエラーを得たエンティティ:私はそれを修正するにはどうすればよいクラステンプレートの状態のデータメンバではなく、明示的

template<typename T, bool B = is_fundamental<T>::value> 
class class_name; 

template<> 
class class_name<string, false>{ 
public: 
    static string const value; 
}; 

template<> 
string const class_name<string, false>::value = "Str"; 
// error: not an entity that can be explicitly specialized.(in VC++) 

+6

の静的メンバを特化でき@KerrekSB

template<typename T, bool B = is_fundamental<T>::value> class class_name; // NOTE: template<> is needed here because this is an explicit specialization of a class template template<> class class_name<string, false>{ public: static string const value; }; // NOTE: no template<> here, because this is just a definition of an ordinary class member // (i.e. of the class class_name<string, false>) string const class_name<string, false>::value = "Str"; 

によって提案されたものです'value'の定義です。 –

+0

@KerrekSBありがとうございました ! –

+0

@KerrekSBこのような答えは、典型的には「答えられる」ことはありませんか?私は、コメントの中で何かを答えるときに、私たちが何をするべきであるべきか/してはならないことを学ぶことを試みている。 – JaredC

答えて

5

ここでは、2つの異なるアプローチを混在させています。最初は別の方法として、あなたは完全な一般的なクラステンプレートを書き出すと、明示的で `テンプレートを<>`アウトのまま<string, false>

template<typename T, bool B = is_fundamental<T>::value> 
class class_name { 
public: 
    static string const value; 
}; 

// NOTE: template<> is needed here because this is an explicit specialization of a class template member 
template<> 
string const class_name<string, false>::value = "Str"; 
+0

Upvoted。また、どちらの場合も、定義はCPPファイル内にある必要があり、メンバーの特殊化の場合は、ヘッダーに特殊化を宣言する必要があります。 –

+0

@ JohannesSchaub-litbはい、いい点ですが、私はあまり気にしていませんでした。ポスターにはメイン()がないなどです – TemplateRex

関連する問題