ほとんどのC++プログラマはいくつかの点で、次のミスを犯しています。エラーはかなり明白である間、あなたはそれを知っていればローカル関数宣言のこの種のいずれかの賢明な利用がある場合ローカル関数宣言には何も使用されていますか?私のような
class C { /*...*/ };
int main() {
C c(); // declares a function c taking no arguments returning a C,
// not, as intended by most, an object c of type C initialized
// using the default constructor.
c.foo(); // compiler complains here.
//...
}
は今、私は思っていましたあなたがそれを行うことができることを除いて - 特にへの道がないので、同じブロック内のそのようなローカル関数を定義する。他の場所で定義する必要があります。
私は、Javaスタイルのローカルクラスは、私が頻繁に使用する傾向があるかなり良い機能、特に匿名の並べ替えだと思います。ローカルのC++クラス(インラインで定義されたメンバ関数を持つことができます)でもいくつかの使い方があります。しかし、定義のないこのローカル関数宣言は、私にとっては非常に扱いにくいようです。それはちょうどC-legacyですか、それとも私が気づいていないより深いユースケースですか?非信者のための
編集は:C c()
は、関数ポインタの宣言ではありません。
このプログラム
int main()
{
void g();
cout << "Hello ";
g();
return 0;
}
void g()
{
cout << "world." << endl;
}
出力Hello world.
void fun()
{
cout << "world." << endl;
}
int main()
{
void g();
g = fun;
cout << "Hello ";
g();
return 0;
}
がコンパイルされません。このプログラム。 gccが文句を言う: error: cannot convert 'void()()' to 'void()()' in assignment
コモー:
error: expression must be a modifiable lvalue
GCCのエラーメッセージは間違っていることに注意してください(既知のバグ)。 "error:void() 'を代入で' void() 'に変換することはできませんが、実際にはtype-idを間違ってデマングルします。 ( "void()"の代わりに、関数(不正な型)を返す関数であれば、 "void()"と言うべきです) –
関連する質問:http://stackoverflow.com/questions/928992/nested -functions-not-allowed-but-why-nested-function-prototypes-are-allowed –
gccのエラーメッセージがバグであるかどうかわかりません - 実際には、 'void * g()'は 'void *'を返す関数であり、 'void(* g)()'は関数へのポインタであるのに対し、あなたは関数ポインタを扱うときに必要な 'void(g)よく、 'void()()'、つまり引数を取らず何も返さないということです。 – Tobias