7

ho ottenuto un errore nel codice qui sotto:classe membro dati template stato, non un'entità che può essere specializzata in modo esplicito

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++) 

Come posso risolvere il problema?

+6

lasciare fuori il 'template <>' in la definizione di "valore". –

+0

@KerrekSB Grazie mille ! –

+0

@KerrekSB Una risposta del genere non dovrebbe mai diventare "risposta"? Sto cercando di capire cosa dovremmo/non dovremmo fare quando rispondiamo a qualcosa in un commento. – JaredC

risposta

5

Qui si stanno miscelando due approcci diversi. La prima è quella suggerita dal @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"; 

In alternativa, si potrebbe completa scrivere il modello generale di classe e specializzarsi in modo esplicito il membro statico per <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

Voto verso l'alto. Inoltre, in entrambi i casi le definizioni devono essere nel file CPP e per il caso di specializzazione del membro, è necessario dichiarare la specializzazione nell'intestazione. –

+0

@ JohannesSchaub-litb Sì, buoni punti, non ero troppo preoccupato di questo perché il poster non aveva un 'main()' ecc. – TemplateRex

Problemi correlati