2016-08-19 7 views
9

Wznawiam C++ i śledzę samouczek bez rzeczywistych problemów. Jednak mam do sekcji na elemencie który mówi, że w C++ 14 można używać zarówno niestatyczny inicjalizacji i unifrom inicjalizacji. Jak na: -Używam C++ 14 lub jest mój kod, używając structs, invalid?

However, in C++14, this restriction was lifted and both can be used. If both are provided, the initializer list/uniform initialization syntax takes precedence. In the above example, Triangle x would be initialized with length and width 2.0.

Kod mam to: -

struct Triangle 
{ 
    double length = 1.23; // non-static member initialization 
    double width = 2.45; 
}; 

int Triangular() 
{ 
Triangle x{ 2.0, 2.0 }; // uniform initialization 

return 0; 
} 

...... 
int main() ...... 

Jednak nie mogę tego skompilować (używam Code :: Blocks na Windows 7). Jeśli usunąć non-static inicjalizacji i zastosowania (tj usunąć = 1.23 i = 2.45) to nie skompilować: -

struct Triangle 
{ 
    double length; // non-static member initialization 
    double width; 
}; 

int Triangular() 
{ 
Triangle x{ 2.0, 2.0 }; // uniform initialization 

return 0; 
} 

...... 
int main() ...... 

Moją pierwszą myślą było to, że nie mam C++ 14. Więc śledzę Enabling -std=c++14 flag in Code::Blocks i wydają się mieć kompilatora C++ ustawiony na 14 (Jedynym wyjątkiem jest to, że nie było make.exe więc program make jest mingw32-make.exe (zgodnie Ustawienia/kompilatora/Toolchain wykonywalne).


mam: - GNU GCC kompilator

ustawienia kompilatora jak: -

-std = C++ 14 compil er flagi

-std = C++ 98 -std = C++ 0x -std = C++ 11 jak Zastępuje

Toolchain wykonywalne jak: -

gcc.exe C Compiler g ++. exe kompilator C++ g ++. exe Linker dynamicznych bibliotekami ar.exe Linker dla bibliotekami statycznych GDB/CDB debugger: Domyślnie windres.exe zasobów kompilator mingw32-make.exe programu make

Projekt Budowanie opcje są puste (Zakładam więc, Kodeks :: Ustawienia blokowe są używane.)


Kiedy skompilować kod uszkodzoną (pierwszy kod z non-statycznych Initialisations) pojawia się następujący: -

Build Log

g++.exe -Wall -fexceptions -g -std=c++14 -c "D:\C++ Projects\gettingStarted\main.cpp" -o obj\Debug\main.o 
D:\C++ Projects\gettingStarted\main.cpp: In function 'int Triangular()': 
D:\C++ Projects\gettingStarted\main.cpp:24:22: error: no matching function for call to 'Triangle::Triangle(<brace-enclosed initializer list>)' 
Triangle x{ 2.0, 2.0 }; // uniform initialization 
        ^
D:\C++ Projects\gettingStarted\main.cpp:24:22: note: candidates are: 
D:\C++ Projects\gettingStarted\main.cpp:16:8: note: constexpr Triangle::Triangle() 
struct Triangle 
     ^
D:\C++ Projects\gettingStarted\main.cpp:16:8: note: candidate expects 0 arguments, 2 provided 
D:\C++ Projects\gettingStarted\main.cpp:16:8: note: constexpr Triangle::Triangle(const Triangle&) 
D:\C++ Projects\gettingStarted\main.cpp:16:8: note: candidate expects 1 argument, 2 provided 
D:\C++ Projects\gettingStarted\main.cpp:16:8: note: constexpr Triangle::Triangle(Triangle&&) 
D:\C++ Projects\gettingStarted\main.cpp:16:8: note: candidate expects 1 argument, 2 provided 
Process terminated with status 1 (0 minute(s), 0 second(s)) 
1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) 

Korzystanie drugi kod (non-static inicjalizacji usunięty), pojawia się ostrzeżenie o X nie jest używany (to jest w porządku, że może uda mi) zgodnie z: -

Build Log

-------------- Build: Debug in gettingStarted (compiler: GNU GCC Compiler)--------------- 

g++.exe -Wall -fexceptions -g -std=c++14 -c "D:\C++ Projects\gettingStarted\main.cpp" -o obj\Debug\main.o 
D:\C++ Projects\gettingStarted\main.cpp: In function 'int Triangular()': 
D:\C++ Projects\gettingStarted\main.cpp:24:10: warning: unused variable 'x' [-Wunused-variable] 
Triangle x{ 2.0, 2.0 }; // uniform initialization 
     ^
g++.exe -o bin\Debug\gettingStarted.exe obj\Debug\main.o obj\Debug\myotherfile.o 
Output file is bin\Debug\gettingStarted.exe with size 1.07 MB 
Process terminated with status 0 (0 minute(s), 1 second(s)) 
0 error(s), 1 warning(s) (0 minute(s), 1 second(s)) 

Sądzę, że używam nieprawidłowego kodu lub nie kompiluję przy użyciu C++ 14, ale raczej C++ 11. Czy problem jest jednym z nich, czy może czymś innym?

+0

Twoja wersja kompilatora GCC nie może obsługiwać języka C++ 14 ... tylko przypuszczenie, również dlatego, że nie jestem świadomy tej funkcji w C++ 14 lub jakiejkolwiek innej wersji C++. – nbro

+0

Pobierałem, co mogło być, późniejsza wersja MinGW z [MinGW Distro - nuwen.net] (https://nuwen.net/mingw.html). Być może to zadziała. Ta funkcja nie jest raczej potrzebna, ale mogę się nauczyć od rozwiązania problemu. – MikeT

+0

Wierzę, że problem dotyczył kompilatora. Jednak mam teraz do czynienia z problemem, który moim zdaniem jest moją wersją systemu Windows 7/mającą procesor 64-bitowy. tzn. otrzymuję 'c:/mingw/mingw/bin /../ lib/gcc/x86_64-w64-mingw32/6.1.0 /../../../../ x86_64-w64-mingw32/bin/ld.exe: architektura i386 pliku wejściowego '' obj \ Debug \ myotherfile.o 'jest niekompatybilna z i386: wyjście x86-64 collect2.exe: błąd: ld zwrócił 1 status wyjścia 'Myślę, że powrócę do dostarczone MinGW i nie używać obu typów inicjalizacji zgodnie z C++ 11. Być może, gdy poznam lepiej C++. Spróbuję rozwiązać ten problem. – MikeT

Odpowiedz

10
Triangle x{ 2.0, 2.0 }; 

Linia powyżej próbuje wykonać zbiorczą inicjalizacji Triangle. Jednak w języku C++ 11 obecność niestatycznych inicjalizatorów elementów danych lub domyślnych inicjatorów członów , które są obecnie znane, uniemożliwiła Triangle bycie agregatem, a inicjalizacja zakończy się niepowodzeniem.

Ta reguła miała wartość modified in C++14, a agregaty mogą mieć domyślne inicjatory członków. Wygląda na to, że Twój kompilator jeszcze tego nie obsługuje. Twój przykład robi compile na zgodnym kompilatorze C++ 14.