4

次のスニペットがあるとします。

template <class T> void f(T arg) { arg(); }

void g()
{
   struct { void operator()(void) { } } foo;

   f(foo);
}

Visual C++ はこれを受け入れます。ただし、GCC を試すと、次のようになります。

$ g++ --version # just in case this matters
g++ (Debian 4.4.5-8) 4.4.5
...
$ g++ foo.cc
foo.cc: In function 'void g()':
foo.cc:7: error: no matching function for call to 'f(g()::<anonymous struct>&)'

fooグローバルにスコープされ、そのタイプに名前がある場合、これは機能します。ただし、型が匿名であるか、内部で宣言されg()ている場合はそうではありません。

GCC がこれを拒否するのはなぜですか? 有効な C++ ですか?

4

2 に答える 2

7

14.3.1 パラグラフ 2:

ローカル型、リンケージのない型、名前のない型、またはこれらの型の複合型は、テンプレート型パラメーターのテンプレート引数として使用してはなりません。

つまり、無効です。それは便利なイモですが、それがVCがそれを許可している理由かもしれません。

于 2011-01-11T15:25:42.023 に答える
2

既に述べたように、ローカル クラス (関数内で定義されたクラス) はテンプレート引数として使用できません。幸いなことに、C++0x はラムダ関数でそれを修正します: http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions

于 2011-01-11T15:58:13.747 に答える