Có. Giá trị trong các container STL cần phải duy trì ngữ nghĩa sao chép. IOW, chúng cần phải hoạt động như các kiểu nguyên thủy (ví dụ: int), có nghĩa là, trong số những thứ khác, chúng nên được cấu hình mặc định.
Nếu không có yêu cầu (và các yêu cầu khác), sẽ không cần thiết để thực hiện các hoạt động sao chép/di chuyển/hoán đổi/so sánh nội bộ khác nhau trên cấu trúc dữ liệu.
Khi tham chiếu đến tiêu chuẩn C++, tôi thấy câu trả lời của mình không chính xác. Default-xây dựng, trong thực tế, không phải là một yêu cầu:
Từ 20.1.4.1:
The default constructor is not required. Certain container class member function signatures specify the default constructor as a default argument. T() must be a well-defined expression ...
Vì vậy, nói cho đúng, kiểu giá trị của bạn chỉ cần phải được constructible mặc định nếu bạn tình cờ được sử dụng một hàm của vùng chứa sử dụng hàm tạo mặc định trong chữ ký của nó.
Yêu cầu thực tế (23.1.3) từ tất cả các giá trị được lưu trữ trong vùng chứa STL là CopyConstructible
và Assignable
.
Ngoài ra còn có các yêu cầu cụ thể khác cho các vùng chứa cụ thể, chẳng hạn như là Comparable
(ví dụ: đối với các khóa trên bản đồ).
Ngẫu nhiên, sau biên dịch không có lỗi trên comeau:
#include <map>
class MyClass
{
public:
MyClass(int t);
};
int main()
{
std::map<int, MyClass> myMap;
}
Vì vậy, đây có thể là một g ++ vấn đề.
Nguồn
2009-03-29 23:54:51
Đoạn mã trên chỉ biên soạn tốt trên MinGW (g ++ 3.4.5) và MSVC++ 2008, với điều kiện một typedef cho MyType được đưa ra và dấu chấm phẩy được nối vào cuối lớp. Bạn phải làm điều gì khác (ví dụ: nhà điều hành gọi [] như đã đề cập bởi bb) - vui lòng đăng * mã * đầy đủ. –
Ah, vâng, bạn nói đúng. Sẽ làm. –
Vâng, không cần sử dụng myMap bạn không biết cần phải biên dịch gì cho lớp bản đồ. Nhà cung cấp thư viện stl và phiên bản nào cũng có thể hữu ích. –