2016-08-19 19 views
9

Tôi đang xem lại C++ và đang theo dõi một hướng dẫn không có vấn đề thực sự. Tuy nhiên, tôi đã có đến một phần trên struct mà nói rằng trong C++ 14 bạn có thể sử dụng cả hai không tĩnh khởiunifrom khởi. Theo: -Tôi đang sử dụng C++ 14 hoặc là mã của tôi, sử dụng cấu trúc, không hợp lệ?

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.

Mã tôi có là: -

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() ...... 

Tuy nhiên, tôi không thể có được điều này để biên dịch (Tôi đang sử dụng Code :: Blocks trên Windows 7). Nếu tôi loại bỏ các initialisation không tĩnh và sử dụng (nghĩa là loại bỏ các = 1.23= 2.45) sau đó nó biên dịch: -

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

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

return 0; 
} 

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

Suy nghĩ đầu tiên của tôi là tôi không có C++ 14. Vì vậy, tôi đã theo Enabling -std=c++14 flag in Code::Blocks và tôi dường như có trình biên dịch thiết lập để C++ 14 (một ngoại lệ là không có make.exe nên làm chương trình là mingw32-make.exe (theo Cài đặt/biên dịch/toolchain thực thi).


tôi có: - GNU GCC biên dịch

thiết lập trình biên dịch như sau: -

-std = C++ 14 compil er cờ

-std = C++ 98 -std = C++ 0x -std = C++ 11 như supercedes

toolchain chương trình chạy như sau: -

gcc.exe C Compiler g ++. exe C++ Compiler g ++. exe Linker cho libs động ar.exe Linker cho libs tĩnh GDB/CDB debugger: Mặc định windres.exe Resource biên dịch mingw32-make.exe Make chương trình

Dự án Xây dựng lựa chọn đều trống (Vì vậy, tôi cho rằng Bộ luật :: thiết lập Khối được sử dụng.)


Khi tôi biên dịch mã thất bại (mã đầu tiên với initialisations không tĩnh) Tôi nhận được như sau: -

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

Sử dụng mã thứ hai (khởi động không tĩnh bị xóa) Tôi chỉ nhận được cảnh báo về x không được sử dụng (đó là tốt tôi có thể quản lý điều đó) theo: -

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

Vì vậy, tôi tin rằng tôi đang sử dụng mã không hợp lệ hoặc tôi không biên dịch bằng C++ 14 mà là C++ 11. Có phải vấn đề này là một trong những vấn đề này hay có lẽ là cái gì khác?

+0

Phiên bản trình biên dịch GCC của bạn không thể hỗ trợ C++ 14 ... chỉ là phỏng đoán, cũng bởi vì tôi không biết tính năng này trong C++ 14, hoặc bất kỳ phiên bản nào khác của C++. – nbro

+0

Tôi đang tải xuống những gì có thể, phiên bản sau của MinGW từ [MinGW Distro - nuwen.net] (https://nuwen.net/mingw.html). Có lẽ điều này sẽ làm việc. Nó không phải là cần tính năng này thay vì tôi có thể học hỏi từ việc giải quyết vấn đề. – MikeT

+0

Tôi tin rằng trình biên dịch là vấn đề. Tuy nhiên, bây giờ tôi đang đối mặt với một vấn đề với những gì tôi nghĩ là phiên bản của Windows 7/có một bộ xử lý 64 bit. tức là tôi nhận được 'c:/mingw/mingw/bin/../ lib/gcc/x86_64-w64-mingw32/6.1.0 /../../../../ x86_64-w64-mingw32/bin/ld.exe: kiến ​​trúc i386 của tệp đầu vào '' obj \ Debug \ myotherfile.o 'không tương thích với đầu ra i386: x86-64 collect2.exe: lỗi: ld trả về 1 trạng thái thoát' Tôi nghĩ tôi sẽ hoàn nguyên về cung cấp MinGW và không sử dụng cả hai loại initialisation theo C++ 11. Có lẽ khi tôi quen thuộc hơn với C++. Tôi sẽ xem xét giải quyết điều đó. – MikeT

Trả lời

10
Triangle x{ 2.0, 2.0 }; 

Dòng trên đang cố gắng thực hiện khởi tạo tổng hợp Triangle. Tuy nhiên, trong C++ 11, sự hiện diện của các bộ khởi tạo thành viên dữ liệu không tĩnh hoặc các bộ khởi tạo thành viên mặc định như chúng bây giờ được gọi là, ngăn Triangle khỏi tổng hợp và khởi tạo sẽ không thành công.

Quy tắc này là modified in C++14 và tổng hợp giờ đây được phép có trình khởi tạo thành viên mặc định. Có vẻ như trình biên dịch của bạn chưa hỗ trợ điều đó. Ví dụ của bạn là compile trên trình biên dịch C++ 14 phù hợp.

Các vấn đề liên quan