2011-10-06 6 views
13

私からのMinGWを構築したトランクバージョンGCC-4.7.0:非静的データメンバ初期化子が実装されていると言われて、このバージョンの変更点の説明ではhttp://code.google.com/p/mingw-builds/downloads/list非静的データメンバの初期化子の質問

http://gcc.gnu.org/gcc-4.7/changes.html

http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm

私はそのような例をコンパイルしよう:

#include <iostream> 
#include <string> 

struct type { 
    type() 
     :i(33) 
    {} 

    int i; 
    std::string s("string"); 
}; 

int main() { 
    type t; 
    std::cout << t.i << " : " << t.s << std::endl; 
} 

私は、エラーのトンを取得し、これは終わりである:

main.cppに:16:35:注:「STD ::文字列(タイプ:: )(INT){別名 STD :: = basic_string(type ::)(int)}は 'const'から派生していません。 std :: basic_string < _CharT、_Traits、_Alloc> 'main.cpp:16:35:note: オーバーロードされたアドレスを解決できませんでした関数 't.type :: s'

しかし、ドキュメントに従って、コードは正しいです。

+4

私はそれをテストするためにGCC 4.7をインストールしておらず、私のバージョンはありません。サポートメンバの初期化を行いますが、-std = C++ 0xフラグを指定してコンパイルしますか? – Griwes

+0

メンバ初期化子はGCC 4.7で新しくなっているので、単純なコンパイラのバグでなければなりません。 –

+0

to Griwes:はい。 – niXman

答えて

14

問題は、関数またはオブジェクトを宣言しているかどうかを判断する際にあいまいであると思われ、コンパイラは関数を選択しています。

あなたは代わりにこの構文を使用して文字列を初期化しようとする必要があります

std::string s = "string"; 

我々は非静的データメンバ初期化子に関するGCCリリースノート(proposal N2756)からリンクをたどった場合、彼らは、問題1でこれに言及

CWGはKonaで6から3のストローク・ポーリングを行い、クラス・スコープ・ルックアップを得ました。 これは、非スタティックのイニシャライザ のデータメンバを "= initializer-clause"と "{ initializer-list}"フォームに限定して、このホワイトペーパーで提案しているものです。

+0

これは 'std :: string s(" string ");'が有効な関数宣言であることを意味しますか?どのように解釈すればいいのか説明できますか? –

+3

これは '明示的な'コンストラクタでも機能しますか?いずれにせよ、私はおそらく 'std :: string s {" string "};'を好むでしょう。 –

+0

@Björn:これは有効な宣言ではありません。有効な関数宣言であれば、コンパイルエラーは発生しません。 –

0

データメンバーは、ブレースまたはイコールイニシャライザーで初期化する必要があります。 訪問http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm

8.5イニシャライザ[dcl.init]

変更イニシャライザための文法:

イニシャライザ:

= ( expression-list ) 

ブレース-OR-等しい初期化子:

= initializer-clause 

    braced-init-list 
関連する問題