1

main() の外の関数で構造体を使用するには、前方宣言を使用して main() で定義できますか、それともブロックの外で定義する必要がありますか?

4

1 に答える 1

4

の内部で構造体を定義すると、構造体main()のグローバル名が非表示になります。したがって、 の外側の関数main()はグローバル名のみを参照できます。この例は、C++ 2011 ドラフト、セクション 9.1 p2 からの抜粋です。

struct s { int a; };

void g() {
    struct s;              // hide global struct s
                           // with a block-scope declaration
    s* p;                  // refer to local struct s
    struct s { char* p; }; // define local struct s
    struct s;              // redeclaration, has no effect
}

関数スコープ外からローカルに定義された型を参照する構文はありません。そのため、テンプレートのインスタンス化を表現する方法がないため、テンプレートを使用しても失敗します。

template <typename F> void bar (F *f) { f->a = 0; }

int main () {
    struct Foo { int a; } f = { 3 };
    bar(&f);                         // fail in C++98/C++03 but ok in C++11
}

実際、この回答で説明されているように、これは C++11 で許可されるようになりました。

于 2012-09-19T02:21:46.467 に答える