2011-01-11 12 views
4

スコープのは、私は次のコードを持っているとしましょう:これを受け入れる++は、関数内

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

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

    f(foo); 
} 

のVisual C。私はGCCをしようとするときしかし、私が取得:

fooがグローバルスコープされ、その種類は名前を持っている
$ 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>&)' 

、これは動作します。しかし、タイプが匿名の場合またはの中にg()と宣言されていません。

なぜGCCはこれを拒否しますか?それは有効なC + +ですか?

答えて

7

14.3.1段落2:

ローカル・タイプ、無結合を有するタイプ、名前型またはこれらのタイプのいずれかから配合タイプ テンプレートtypeparameterため templateargumentとして使用してはなりません。

つまり、無効です。それは便利なことですが、それはおそらくVCが許可する理由です。

+2

これは、例えばC++でのクロージャの欠如に対する実行可能な代替手段でした。 –

+1

このような簡単な答えをありがとう。私にとっては、この使用法は言語の "精神"に適合しているようですが、なぜこれが実装者にいくつかの手間を省くためにスコープされたのかも知れません。 – asveikau

+1

。それは本当にそこに属していない単なる関数で一度使用される構造体でグローバルまたは他の名前空間を乱雑にすることです。 – stijn

2

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

+0

私はC++ 0xでもローカルクラスをテンプレート引数として使うことができると思います! – ltjax