Como parte de una clase de rasgos para un programa más grande, intenté crear una variable de clase estática que podría tener un valor diferente según el tipo con el que se creaba la instancia de la plantilla de clase adjunta.Compilador G ++ ¿Error o código defectuoso? : "definición de plantilla de no plantilla"
He simplificado el código correspondiente para llegar a un ejemplo escueto de lo que estoy hablando:
#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, esto da un error del compilador: template definition of non-template ‘std::string Foo<T, Enable>::message
. El problema ocurre debido a las dos últimas líneas, donde solo estoy definiendo la variable estática std::string Foo<T, Enable>::message
.
Estoy confundido por qué está sucediendo esto. El error del compilador desaparece si omito las últimas dos líneas (pero, por supuesto, eso causa errores del enlazador.) ¿Es esto un error del compilador con GCC?
+1 para "un ejemplo escueto". http://sscce.org/. –
Necesita incluir –
@Vaughn, ese no es el problema aquí, pero actualicé el fragmento de código. – Channel72