2011-10-06 27 views
13

tôi đã xây dựng MinGW từ thân cây-phiên bản GCC-4.7.0: http://code.google.com/p/mingw-builds/downloads/listkhông tĩnh thành viên dữ liệu initializers câu hỏi

Trong mô tả những thay đổi của phiên bản này người ta nói rằng không tĩnh initializers thành viên dữ liệu được thực hiện : http://gcc.gnu.org/gcc-4.7/changes.html

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

Khi tôi cố gắng để biên dịch một ví dụ như vậy:

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

tôi nhận được một tấn lỗi, và là một trong những này cuối cùng:

main.cpp: 16: 35: lưu ý: 'std :: string (loại :: ) (int) {aka std :: basic_string (loại ::) (int)} 'không bắt nguồn từ' const std :: basic_string < _CharT, _Traits, _Alloc> 'main.cpp: 16: 35: note: không thể giải quyết địa chỉ từ quá tải function 't.type :: s'

Nhưng theo tài liệu, mã đúng.

+4

Tôi chưa cài đặt GCC 4.7 để kiểm tra và phiên bản của tôi không hỗ trợ khởi tạo thành viên, nhưng bạn có biên dịch nó với cờ -std = C++ 0x không? – Griwes

+0

Lưu ý rằng các trình khởi tạo thành viên là mới đối với GCC 4.7, do đó, nó phải là một lỗi trình biên dịch đơn giản. –

+0

để Griwes: có. – niXman

Trả lời

14

Sự cố có vẻ là sự mơ hồ trong việc xác định xem bạn đang khai báo hàm hay đối tượng và trình biên dịch đang chọn hàm.

Bạn nên cố gắng khởi tạo chuỗi sử dụng cú pháp này để thay thế:

std::string s = "string"; 

Nếu chúng ta làm theo các liên kết từ GCC Ghi chú Phát hành về initializers thành viên dữ liệu không tĩnh (proposal N2756), họ đề cập đến điều này trong vấn đề 1, với ghi chú có độ phân giải này:

CWG đã có cuộc thăm dò ý kiến ​​về rơm rạ từ 6 đến 3 trong Kona để tìm kiếm phạm vi lớp học; và đó là những gì bài báo này đề xuất, với trình khởi tạo cho các thành viên dữ liệu không tĩnh được giới hạn trong các biểu mẫu “= initializer-clause” và “{ initializer-list}”.

+0

Điều này có nghĩa là 'std :: string s (" string ");' là khai báo hàm hợp lệ không? Bạn có thể giải thích làm thế nào tôi nên giải thích nó? –

+3

Điều này cũng làm việc cho các nhà xây dựng được 'rõ ràng'?Dù bằng cách nào tôi cũng có thể thích 'std :: string s {" string "};'. –

+0

@ Björn: Đây không phải là tuyên bố hợp lệ. Nếu đó là một khai báo hàm hợp lệ, sẽ không có lỗi biên dịch. –

0

Thành viên dữ liệu phải được khởi tạo bằng trình khởi tạo dấu ngoặc đơn hoặc bằng nhau. Visit http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm

8,5 Initializers [dcl.init]

Thay đổi ngữ pháp cho initializer:

initializer:

= ( expression-list ) 

cú đúp-hoặc-bằng-initializer:

= initializer-clause 

    braced-init-list 
Các vấn đề liên quan