Tôi cố gắng viết một vùng chứa kiểu tùy chỉnh STL. Để đơn giản, hãy nói đó là danh sách. Tôi nhìn lên theo cách tiêu chuẩn để xác định một container như:Lớp lồng nhau làm tham số mẫu
template <typename T, typename A = std::allocator<T> > class mylist;
Bây giờ, tôi muốn quản lý các nút của danh sách bằng cách sử dụng một lớp lồng nhau:
(inside mylist)
class node {
T data;
node *next;
}
Đó là sự hiểu biết của tôi mà tôi không cần đặt một thông số template
ở phía trước định nghĩa node
khi trình biên dịch sẽ khởi tạo các lớp riêng biệt mylist<T,A>::node
cho mỗi kết hợp các tham số mẫu của mylist
.
Tuy nhiên, bây giờ tôi cần cấp phát bộ nhớ không chỉ cho dữ liệu thuộc loại T
mà còn cho trình bao bọc của chúng node
. Vì vậy, tôi muốn tham số mẫu mặc định là loại std::allocator<mylist<T>::node>
. Vào thời điểm đó, mặc dù, mylist
vẫn chưa được công bố và trình biên dịch được hiểu rầu rĩ:
error: `mylist' was not declared in this scope
Làm thế nào người ta sẽ giải quyết câu hỏi hóc búa này? Có hai ràng buộc:
- Thông thường, tôi sẽ khai báo lớp bị thiếu mà không khai báo đầy đủ nội dung của lớp. Tuy nhiên, vì nó được lồng vào bên trong thứ tôi muốn khai báo, đây không phải là một lựa chọn.
- Tôi cần
node
để lồng nhau vì cần truy cập phiên bản cấp phátmylist
. Ví dụ: Tôi có sốoperator=
được khai báo trênnode
nơi rất nhiều quản lý bộ nhớ diễn ra theo cách đệ quy. Điều này có thể là quá mức cần thiết cho một danh sách và bạn có thể thực hiện điều đó từ bên trongmylist
, do đó giảm sự phụ thuộc tham số củanode
trênA
, nhưng nó rất quan trọng đối với cấu trúc dữ liệu tôi đang triển khai.
Có thể đáng xem xét cách g ++ triển khai 'std :: list'. –
Nhìn vào phân bổ 'rebind' – Yakk