定义没有类的模板变量

时间:2012-09-20 09:42:20

标签: c++ templates

我想在没有类的情况下定义模板变量,但是MSVC ++不接受它,并且根据C ++标准,谷歌搜索似乎是不正确的:

template<CharType> static CharType hexDigits[17];
template<> char hexDigits[17] = "0123456789ABCDEF";
template<> wchar_t hexDigits[17] = L"0123456789ABCDEF";

然后将在(非专业)模板函数中使用这些专用变量。

所以我不得不这样写:

template<typename CharType> class dummyclass {
    static CharType hexDigits[17];
};
template<> char dummyclass<char>::hexDigits[17] = "0123456789ABCDEF";
template<> wchar_t dummyclass<wchar_t>::hexDigits[17] = L"0123456789ABCDEF";

有没有办法可以定义这两个变量而不用定义一个虚拟类?

另外,有没有什么好理由为什么 C ++标准不允许第一段代码?毕竟,允许在课堂外使用模板函数

2 个答案:

答案 0 :(得分:2)

  

另外,C ++标准不允许第一段代码有什么好的理由吗?毕竟,允许类外的模板函数。

请注意:

template<CharType> static CharType hexDigits[17];
template<> char hexDigits[17] = "0123456789ABCDEF";
template<> wchar_t hexDigits[17] = L"0123456789ABCDEF";

有两个不同类型但名称相同的符号:这不可能有效,因此编译器必须开始修改/修改变量名称,就像它已经为函数和类做的那样。

就干净利落地实现这一点而言,这看起来像我的特质......如果您不介意获取链接错误而不是编译错误,您甚至可以跳过专门化并仅声明相应的静态成员:

template <typename CharType> struct my_char_traits {
    static CharType hex_digits[17];
};

template<> char my_char_traits<char>::hex_digits[17] = "0123456789ABCDEF";
template<> wchar_t my_char_traits<wchar_t>::hex_digits[17] = L"0123456789ABCDEF";

答案 1 :(得分:0)

您只能创建类模板或结构或函数模板。

模板变量就像你试图做的那样在C ++中是非法的。

您必须创建一个类模板,然后使用它。