g++ 3.4.5 は次のコードを受け入れます。
template <typename T> struct A
{
static const char* const str;
};
struct B {};
typedef A<B> C;
template<> const char* const C::str = "B";
// Equivalent to following?
// template<> const char* const A<B>::str = "B";
しかし、それが実際に合法的な C++03 であるかどうかはわかりません。特に、
[14.7p3] クラス テンプレート、クラス テンプレートのメンバー、またはクラス メンバー テンプレートの明示的な特殊化宣言では、明示的に特殊化されるクラスの名前は template-id になります。
この要件は、この例の最後で非 typedef バージョンを使用する必要があることを示していますか? それとも私は何かを誤解しましたか?
編集: さらなる証拠:欠陥レポート 403は、型 (そのコンテキストでは、関数呼び出し式の引数の型) を template-id と言うのは正しくないことを示唆しています。 1。標準のその後のドラフトでは、3.4.2の「 template-id 」の代わりに「クラス テンプレートの特殊化」が使用されています。
A<B>
これは、 と が同じ型をC
表している (そして、同一またはほぼ同一の意味的意味を持っている)が、テンプレート ID でありA<B>
、テンプレートIDでC
はないという引数をサポートします。それらのトークンの意味。