2

我想定义没有类的模板变量,但 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++ 标准不允许第一段代码有什么好的理由吗?毕竟,类外的模板函数是允许的。

4

2 回答 2

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";
于 2012-09-20T10:30:57.890 回答
0

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

像您尝试做的模板变量在 C++ 中是非法的。

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

于 2012-09-20T09:46:35.530 回答