我有一个类模板name
来检测类型名称。它适用于简单类型,如int
,float
。但是,对于某些模板类型(如std:pair
),编译器(VS2013)会在我尝试定义其静态成员变量时在行上报告错误。带模板的类模板专业化
#include <cassert>
#include <memory>
using namespace std;
template<class T> struct name{ static const char* value; };
template<class T> const char* name<T>::value = "unknown";
template<> const char* name<int>::value = "int";
template<> const char* name<float>::value = "float";
template<class T1, class T2> const char* name<pair<T1, T2> >::value = "pair"; //compilation error
void main()
{
assert(name<int>::value == "int");
assert(name<float>::value == "float");
assert(name<double>::value == "unknown");
assert((name<pair<int, char> >::value) == "pair");
}
如果我用以下四行替换该行,该程序按预期工作。
template<class T1, class T2> struct name < pair<T1, T2> > {
static const char* value;
};
template<class T1, class T2> const char* name<pair<T1, T2> >::value = "pair";
但这种方式看起来很丑,由于一些重复的代码。有什么方法可以四处走动吗?
更新已修复了一些明显符合标准的问题。
很难甚至开始枚举所有的都错了,此代码的东西,而是专心于手头的问题:你只能专注静态数据成员明确,但不能部分。 – 2014-10-18 14:24:52
对不起,你正在使用这样一个可怕的编译器,你不知怎么就想到你的代码是远程正确的。几乎每一行都有严重的错误,我责怪编译器欺骗你认为这是好的。 – 2014-10-18 14:25:45
你应该使'static const char * const值'类型 – 2014-10-18 14:27:01