2011-11-04 33 views
8

Tôi nhận được lỗi sau trong C của tôi ++ chương trình:Không constructor mặc định thích hợp sẵn

1>   c:\users\thom\documents\cworkspace\barnaby\barnaby\timezone.cpp(14) : see reference to class template instantiation 'std::map<_Kty,_Ty>' being compiled 

Đây là xuống một chút trong ngăn xếp lỗi nhưng điểm đến dòng mã này:

static std::map<const std::string, Timezone> timezoneMap; 

Lý do là Timezone có một hàm tạo khá phức tạp, nhưng không có hàm tạo mặc định. Dưới đây là một phần của lỗi:

c:\program files\microsoft visual studio 10.0\vc\include\map(215): error C2512: 'Timezone::Timezone' : no appropriate default constructor available 

1> c: \ program files \ visual studio microsoft 10.0 \ vc \ include \ bản đồ (210): khi biên dịch hàm thành viên lớp mẫu 'múi giờ & std :: map < _Kty, _Ty> :: toán tử [] (const std :: basic_string < _Elem, _Traits, _Ax> &) '

Câu hỏi của tôi là, tại sao? Tại sao bản đồ lại cố gắng xây dựng một đối tượng Timezone? Tại sao nó cũng cần quá nếu tôi luôn đặt các vật thể hoàn chỉnh vào bản đồ của tôi? Đặc biệt, tại sao lỗi này khi tôi khởi tạo bản đồ?

Trả lời

12

lẽ Bạn đang sử dụng 's operator[]không đòi hỏi các nhà xây dựng mặc định (nếu nó không, làm thế nào nó sẽ xử lý các trường hợp là chìa khóa không tồn tại trong bản đồ?) map. Nếu bạn sử dụng insert thay vì bạn có thể có thể thoát khỏi việc không cung cấp (tôi không thể nhớ nếu tiêu chuẩn yêu cầu hàm tạo mặc định cho tất cả bản đồ hoặc chỉ khi bạn sử dụng toán tử đó).

+1

+1 Nội dung hay. Lưu ý rằng đối với 'std :: map ' với 'rõ ràng Foo :: Foo (int)' hàm tạo duy nhất và với hàm tạo bản sao rõ ràng, bạn luôn có thể nói 'm.insert (std :: make_pair (1, 5)); ', nhưng bạn chỉ có thể nói' m.insert (std :: make_pair (1, Foo (5))); 'trong C++ 11. –

1

Đối tượng bản đồ cần một hàm tạo mặc định khi bạn truy cập cấu trúc bằng [] (lời giải thích trước của tôi quá phức tạp như vô nghĩa - xin lỗi). Xem: Why does the C++ map type argument require an empty constructor when using []?

+0

Điều này nghe có vẻ sai. Không có đối tượng nào được tạo "vô hình". Bản đồ chỉ tạo ra một đối tượng khi bạn muốn nó một cách rõ ràng. –

+0

Bạn nói đúng. Tôi hoàn toàn không nói những gì tôi có ý nghĩa. @ Mark-B đã làm. – drdwilcox

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