Tôi có một kiểu dữ liệu đệ quy như thế này:templated kiểu dữ liệu đệ quy
template<typename T>
struct SomeType {
std::map<T, SomeType<T>> mapping;
};
SomeType<int> foo;
này hoạt động tốt, nhưng thay thế std::map
với std::unordered_map
kết quả trong một lỗi biên dịch do một loại không đầy đủ. Tôi (hoặc gcc) có mắc lỗi ở đâu đó không? hay đây chỉ là một phần của tiêu chuẩn?
Tôi cũng muốn có vùng chứa bên trong được xác định bởi thông số mẫu (như std::stack
và std::queue
), nhưng tôi không thể tìm ra cách để làm điều đó vì yêu cầu SomeType đã được xác định.
Incomplete dụ:
template<typename T, typename C = std::map<T, SomeType<[???]>>>
struct SomeType {
C mapping;
};
SomeType<int, [???]> foo;
Tôi biết điều này có thể được thực hiện với gián tiếp runtime, nhưng đó không phải là những gì tôi đang tìm kiếm.
container tiêu chuẩn thư viện mẫu yêu cầu bạn phải nhanh chóng chúng với các loại hoàn chỉnh; tất cả những thứ khác là hành vi không xác định. Bạn phải sống với điều đó. Bạn có thể sử dụng một giải pháp pimpl để làm việc xung quanh đó, mặc dù. –
@KerrekSB Vậy sao? Chết tiệt, tôi thường xuyên viết những cây n-ary có các nút đã được triển khai dưới dạng 'std :: vector children'. –
@KonradRudolph: Vâng, bạn phải đảm bảo rằng tại thời điểm khởi tạo, loại hoàn tất. Đó có thể là một vấn đề tinh tế. –