2012-05-06 41 views
6

Các mã sau biên dịch với gcc-4.5.1 nhưng không phải trong Visual Studio 11.Visual Studio 11 thời gian biên dịch lỗi sử dụng std :: map

#include <map> 
#include <array> 

typedef std::pair<const unsigned int, std::array<const unsigned int, 4>> pairus; 

int main(){ 

    std::map<const unsigned int, std::array<const unsigned int, 4> > x; 
    std::array<const unsigned int, 4> troll = {1, 2, 3, 4}; 
    x.insert(pairus(1, troll)); 

    auto z = x[1]; 
} 

1 hiện nay được ánh xạ tới std::array<> troll. Việc chèn hoạt động tốt và chương trình biên dịch. Nhưng, ngay sau khi tôi cố gắng auto z = x[1] -> Vì vậy cố gắng để có được mảng troll mà 1 được ánh xạ tới, chương trình không biên dịch với các lỗi sau:

error C2512: 'std::array<_Ty,_Size>::array': không có constructor mặc định thích hợp sẵn

gì gây ra sự khác biệt này trong hành vi giữa gcc và vs11 và cách khắc phục nó?

Cảm ơn.

+0

Bạn có chắc 'pairus' không nên là' make_pair'? (Đừng nghĩ rằng đó là vấn đề của bạn mặc dù) – Corbin

+0

Vâng nó hoạt động tốt với cặp đôi được loại std :: cặp <>. Hành vi biên dịch kỳ lạ này đang khiến tôi bonkers tho. – ScarletAmaranth

+0

Ghép cặp trông như thế nào (giả sử nó là một hàm tùy chỉnh? Hoặc là bí danh của make-pair của MSVC++?). Tôi nghi ngờ vấn đề có thể nằm trong pairus bởi vì không có nhu cầu cho một constructor mặc định bất cứ nơi nào trong mã bạn đăng. (Mặc dù một ctor mặc định sẽ là cần thiết nếu bạn đã làm x [k] trong đó k không có trong bản đồ.) – Corbin

Trả lời

4

Hãy thử auto z = *x.find(1); để thay thế. Máy bay [] yêu cầu loại có thể định cấu hình mặc định. Trong thực tế, toàn bộ vùng chứa yêu cầu loại có thể định cấu hình mặc định, vì vậy bạn thực sự không thể mong đợi bất kỳ điều gì ngoài may mắn ngẫu nhiên khi bạn thử các triển khai khác nhau.

+0

Bạn là một thiên tài! :) Công trinh! :) Gcc xuất hiện để biết một số phép thuật phức tạp. Cảm ơn;) – ScarletAmaranth

+0

Không chắc chắn yêu cầu khởi tạo mặc định là viết tắt của toàn bộ vùng chứa ngay bây giờ khi C++ 11 được chuyển. Bản đồ mới cần có khả năng giữ các loại có thể di chuyển, nhưng chỉ một số chức năng có sẵn cho chúng. Toán tử [] không phải là tôi không nghĩ. –

3

Loại của bạn không thể gán được vì nó chứa hằng số.

x [1] cố gắng trả lại tham chiếu có thể gán. Nó cũng sẽ xây dựng một giá trị rỗng cho khóa nếu nó chưa có. Cả hai loại này đều không hợp lệ với loại của bạn. Thay vào đó, bạn sẽ phải sử dụng tìm kiếm.

+0

Tại sao trên trái đất sẽ gcc biên dịch điều sau đó :)? – ScarletAmaranth

+0

Tiêu chuẩn chỉ quy định những gì được yêu cầu, nó không cho biết những gì được cho phép. Một số cách thức mà việc triển khai gcc hoạt động không gây ra cùng một vấn đề trong trường hợp đặc biệt của bạn. Đó là miễn phí để làm điều này. Không có yêu cầu chẩn đoán ở đây. –

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