c – G编译器错误或错误代码? :“非模板的模板定义”

作为更大程序的traits类的一部分,我尝试创建一个静态类变量,该变量可能具有不同的值,具体取决于包围类模板被实例化的类型.

我已经简化了相关代码,以产生一个我所说的简单的例子:

#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,这给出了一个编译器错误:非模板’std :: string Foo< T,Enable> :: message的模板定义.由于最后两行发生问题,我只是定义静态变量std :: string Foo< T,Enable> :: message.

我很困惑为什么会发生这种情况.如果省略最后两行(但当然会导致链接错误),编译器错误就会消失.这是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节中规定.这个想法是,部分专业化是一个新的模板,并且外部定义的成员的模板参数必须匹配类定义的模板参数,以便它知道该成员使用哪个模板.

在您的示例中,规则避免为不是整数或浮点的类型定义消息成员.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...