[英]G++ Compiler Error or faulty code? : "template definition of non-template"
作为更大程序的特征 class 的一部分,我尝试创建一个 static class 变量,该变量可能具有不同的值,具体取决于实例化封闭 class 模板的类型。
我已经简化了相关代码以生成我正在谈论的内容的简单示例:
#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
。 出现问题是因为最后两行,我只是在其中定义 static 变量std::string Foo<T, Enable>::message
。
我很困惑为什么会这样。 如果我省略最后两行,编译器错误就会消失(但这当然会导致 linker 错误。)这是 GCC 的编译器错误吗?
这仅在您的模板参数匹配部分特化时有效:
template <class T>
std::string Foo<T,
typename std::enable_if<std::is_integral<T>::value>::type
>::message;
template <class T>
std::string Foo<T,
typename std::enable_if<std::is_floating_point<T>::value>::type
>::message;
这在 C++03 标准的第 14.5.4.3 节中指定。 这个想法是部分特化是一个新模板,外部定义的成员的模板参数必须与 class 定义的模板参数相匹配,以便它知道成员使用哪个模板。
在您的示例中,该规则避免为非整数或浮点数的类型定义消息成员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.