Als Teil einer Merkmalsklasse für ein größeres Programm habe ich versucht, eine statische Klassenvariable zu erstellen, die je nach dem Typ, mit dem die umschließende Klassenvorlage instanziiert wurde, einen anderen Wert haben kann.G ++ Compiler Fehler oder fehlerhafter Code? : "Vorlagedefinition von Nichtvorlage"
Ich habe den entsprechenden Code vereinfacht ein nackten Knochen Beispiel zu produzieren, was ich rede:
#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;
mit GCC 4.6, das gibt einen Compiler-Fehler: template definition of non-template ‘std::string Foo<T, Enable>::message
. Das Problem tritt wegen der letzten zwei Zeilen auf, wo ich gerade die statische Variable std::string Foo<T, Enable>::message
definiere.
Ich bin verwirrt, warum das passiert. Der Compiler-Fehler verschwindet, wenn ich die letzten zwei Zeilen weglasse (aber das verursacht natürlich Linker-Fehler). Ist das ein Compilerfehler mit GCC?
+1 für "ein bloßes Beispiel". http://sscce.org/. –
Sie müssen –
@Vaughn einschließen, das ist nicht das Problem hier, aber ich habe das Code-Snippet aktualisiert. – Channel72