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?
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
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
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