Come parte di una classe di caratteri per un programma più grande, ho tentato di creare una variabile di classe statica che poteva avere un valore diverso a seconda del tipo con cui il modello di classe allegato era istanziato.Errore del compilatore G ++ o codice errato? : "definizione modello di non-modello"
Ho semplificato il relativo codice per produrre un esempio ridotto all'osso di quello che sto parlando:
#include <iostream>
#include <string>
#include <type_traits>
template <class T, class Enable = void>
struct Foo;
template <class T>
struct Foo<T,
typename std::enable_if<std::is_integral<T>::value>::type
>
{
static std::string message;
};
template <class T>
struct Foo<T,
typename std::enable_if<std::is_floating_point<T>::value>::type
>
{
static std::string message;
};
template <class T, class Enable>
std::string Foo<T, Enable>::message;
con GCC 4.6, questo dà un errore di compilazione: template definition of non-template ‘std::string Foo<T, Enable>::message
. Il problema si verifica a causa delle ultime due righe, in cui sto solo definendo la variabile statica std::string Foo<T, Enable>::message
.
Sono confuso perché questo sta accadendo. L'errore del compilatore scompare se ometto le ultime due righe (ma ovviamente ciò causa errori di linker.) Si tratta di un errore del compilatore con GCC?
+1 per "un esempio di nudo". http://sscce.org/. –
È necessario includere –
@Vaughn, non è questo il problema, ma ho aggiornato lo snippet di codice. – Channel72