web-dev-qa-db-ja.com

ローカルクラスのメンバーテンプレート

次のコードが与えられます:

 void f()
 {
     class A
     {
         template <typename T>
         void g() {}
     };
 }

g ++ 4.4(およびg++-4.6 -std=gnu++0x)文句を言う:「ローカルクラスのメンバーテンプレートの無効な宣言」。

どうやらローカルクラスはテンプレートメンバーを持つことを許可されていません。この制限の目的は何ですか? C++ 0xで削除されますか?

注:ローカルクラス自体をテンプレートメンバーにするのではなく、テンプレートにする場合:

 void f()
 {
     template <typename T>         
     class A
     {
         void g() {}
     };
 }

「エラー:テンプレート宣言をブロックスコープに表示できません」というメッセージが表示されます。

47
HighCommander4

この制限の目的は?ただの推測ですが:

  • テンプレートクラス/テンプレートメンバー関数は、囲んでいる関数内でのみ使用できます。したがって、関数内で使用されているすべての型をすでに知っているので、使用されている型を直接指定できます(もちろん、いくつかの型の場合、テンプレートバリアントによって入力が節約されます)。
  • そうではないように思われるかもしれませんが、それはすべてのコンパイラ作成者にとっての作業であり、バグのためのスペースであるため、努力する価値があるはずです。

おもしろ情報:関数内でローカルクラスを、関数で宣言された(c ++ 0x)-lambda関数の戻り値の型として使用してみてください:MSVC 2010:内部コンパイラエラー^^。

12
eci