作为更大程序的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节中规定.这个想法是,部分专业化是一个新的模板,并且外部定义的成员的模板参数必须匹配类定义的模板参数,以便它知道该成员使用哪个模板.
在您的示例中,规则避免为不是整数或浮点的类型定义消息成员.
原文地址:https://www.jb51.cc/c/112697.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。