54

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

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() {}
    };
}

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

4

1 に答える 1

12

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

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

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

于 2010-12-08T17:42:55.713 に答える