2012-07-05 5 views
9

私はテンプレートテンプレートパラメータに関連する他のものを探していましたが、テンプレートテンプレートパラメータがではなくであると主張するthis answerが発生しました。テンプレートテンプレートのテンプレートパラメータは、標準の拡張または一部ですか?

ただし、次のコードは、最新の打ち鳴らす(3.2)でコンパイルされ、最新のGCC(4.8):

template<template<template<typename> class> class T> struct test {}; 
template<template<typename> class T> struct foo {}; 
test<foo> bar; 

これは拡張である、または他の答えは実際に間違っている、それがによって許可されています標準?そうでない場合は、その省略の理由は何ですか?

+0

@chris OPはおそらく4.8のスナップショットを意味します。私はしばらく使っています。 – juanchopanza

+0

ええ、私はMacPortsからのスナップショットを持っています...だから、おそらく最新のsvnやそのようなものではありません。 – celticminstrel

+0

これはまた、Ideoneのgcc 4.5でコンパイルします。http://ideone.com/BUAuw – TemplateRex

答えて

8

std::vector<int>では、クラステンプレートstd::vectorは、タイプintがパラメータとして渡されます。 std::get<42>(some_tuple)には、ファンクションテンプレートstd::getに値として42が渡されます。おそらく前者の種類の引数は、テンプレートの型引数(またはテンプレート型引数)と呼ばれ、後者の型は(型の)非型引数です。

しかし、テンプレートは別の種類の引数、つまり他のテンプレートを受け入れることもできます。例えば、template<template<typename> class T> void foo();は、テンプレートを引数とする関数テンプレートを宣言します。それ自体は型引数をとります。 (注釈として、テンプレートは型ではありませんが、 '非型引数'という言葉はまだテンプレートテンプレート引数をカバーしません。template<int NonTypeArgument>のような引数のために予約されています)

テンプレートテンプレートC++(クラス、関数、エイリアスのテンプレートがありますが、それらは集合的に単純に「テンプレート」です)、テンプレートテンプレートのテンプレートパラメータはありません。あなたが持っているのは、予想されるテンプレート引数にテンプレートテンプレート引数そのものがある、ミルテンプレートテンプレートパラメータを使い果たしたことです。あなたがリンクしている回答のように、これを禁じている標準の参照を見つけることができません。

関連する問題