2011-10-06 11 views
13

I został zbudowany MinGW z pnia wersja GCC-4.7.0: http://code.google.com/p/mingw-builds/downloads/listnon-member dane statyczne inicjalizatory pytania

W opisie zmian tej wersji jest powiedziane, że non-statyczne inicjalizatory członkowskich dane są wdrażane : http://gcc.gnu.org/gcc-4.7/changes.html

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

Kiedy próbuję skompilować taki przykład:

#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; 
} 

dostaję mnóstwo błędów, a ten jest w końcu:

main.cpp: 16: 35: Uwaga: „std :: string (typu :: ) (int) {std aka :: basic_string (type ::) (int)} 'nie pochodzi od' const std :: basic_string < _CharT, _Traits, _Alloc> 'main.cpp: 16: 35: uwaga: nie może rozwiązać problemu z przeciążenia funkcja 't.type :: s'

Ale zgodnie z dokumentacją, kod jest poprawny.

+4

Nie mam zainstalowanego GCC 4.7, aby go przetestować, a moja wersja nie inicjowanie członkostwa wspierającego, ale czy kompilujesz je z flagą -std = C++ 0x? – Griwes

+0

Należy zauważyć, że inicjatory elementów są nowe w GCC 4.7, więc powinien to być prosty błąd kompilatora. –

+0

do Griwes: tak. – niXman

Odpowiedz

14

Problem wydaje się być niejednoznacznością w określaniu, czy deklarujesz funkcję lub obiekt, a kompilator wybiera funkcję.

Należy próbować inicjowania ciąg przy użyciu tej składni zamiast:

std::string s = "string"; 

Jeśli kierujemy się link z GCC Release Notes dotycząca non-statycznych inicjalizatorów członkowskich danych (proposal N2756), wspominają o tym problemu 1, z tą uwagą uwaga:

CWG przeprowadziło od 6 do 3 badań słomy w Kona na rzecz kontroli klasy; i to jest to, co proponuje ten dokument, z inicjalizatorami dla niestatycznych elementów danych ograniczonych do formularzy "= initializer-clause" i "{ initializer-list}".

+0

Czy to oznacza, że ​​'std :: string s (" string ");' jest prawidłową deklaracją funkcji? Czy możesz wyjaśnić, jak powinienem to interpretować? –

+3

Czy to również działa dla konstruktorów, które są "jawne"?Tak czy siak bym prawdopodobnie wolał 'std :: string s {" string "};'. –

+0

@ Björn: To nie jest prawidłowa deklaracja. Jeśli była to prawidłowa deklaracja funkcji, nie wystąpiłby błąd kompilacji. –