2

テンプレート パラメーターの可能な形式の 1 つは、クラス テンプレートです。C++ 標準 (C++2003) では、テンプレートのインスタンス化中のテンプレート テンプレート パラメーターの引数は "id-expression" であると規定されています。この非終端記号はかなり広いです。デストラクタ、オーバーロードされた演算子などを許可します。たとえば、次のコードは正常にコンパイルされるはずです。

template <template <typename x> class T>
struct MyClass
{
    T<int> a;
    T<double> b;
};

template <typename x> struct Helper
{
    ~Helper() { }
    x operator+(x p) { return(x[1]+p); }
    x[4] c;
};

 MyClass<Helper> p1;
 MyClass<~Helper> p2;
 MyClass<Helper::operaror+> p3;

最後の 2 行は意味がありません。しかし、文法の観点からは、それらは問題ありません。文法は言語を正確に記述するものではありません (またそうすべきではありません) が、段落 14.3.3、「テンプレート テンプレート引数」では、この文脈における文法規則の制限について言及していません。

誰かが私の声明を受け入れたり、反論したりできますか:

  1. テンプレート テンプレートの引数は識別子のみであり、修飾されている可能性があります。
  2. ポイント 1 が正しい場合、これは標準で言及する価値があることは間違いありません。
4

1 に答える 1

1

14.3 [temp.arg] p1

テンプレート引数には、型、非型、テンプレートの 3 つの形式のテンプレート パラメータに対応する 3 つの形式があります。テンプレート IDで指定された各テンプレート引数の型と形式は、指定された型と形式と一致する必要があります。 template-parameter-list でテンプレートによって宣言された対応するパラメーターの場合。

引数~Helperには、テンプレート テンプレート パラメータの正しい型がありませんtemplate<typename> class T。クラス テンプレートではありません。

14.3.3 [temp.arg.template] p1

テンプレートtemplate-parametertemplate-argumentは、クラス テンプレートの名前であり、 id-expressionとして表されます。

~Helperクラス テンプレートの名前ではありません。

それはあなたの例をかなり明確に除外します。

于 2012-06-16T02:11:40.443 に答える