作为大型程序的特征类的一部分,我尝试创建一个静态类变量,该变量可能具有不同的值,具体取决于实例化封闭类模板的类型。
我已经简化了相关代码以生成我正在谈论的基本示例:
#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;
使用 GCC 4.6,这会产生编译器错误:template definition of non-template ‘std::string Foo<T, Enable>::message
. 问题的出现是因为最后两行,我只是在其中定义静态变量std::string Foo<T, Enable>::message
。
我很困惑为什么会这样。如果我省略最后两行,编译器错误就会消失(但这当然会导致链接器错误。)这是 GCC 的编译器错误吗?