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";

ダミー クラスを定義せずにこれら 2 つの変数を定義する方法はありますか?

また、C++ 標準が最初のコードを許可しない正当な理由はありますか? 結局のところ、クラス外のテンプレート関数は許可されています。

4

2 に答える 2

2

また、C++ 標準が最初のコードを許可しない正当な理由はありますか? 結局のところ、クラス外のテンプレート関数は許可されています。

これに注意してください:

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

には、型は異なるが名前が同じ 2 つのシンボルがあります。

これをきれいに実装するという点では、これは私には特徴のように見えます...コンパイルエラーの代わりにリンクエラーが発生してもかまわない場合は、特殊化をスキップして適切な静的メンバーのみを宣言することもできます:

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 に答える