我嘗試編寫自定義STL樣式的容器。爲了簡單起見,我們假設它是一個列表。我擡起頭,標準的方式來定義這樣的容器:作爲模板參數的嵌套類
template <typename T, typename A = std::allocator<T> > class mylist;
現在,我想用一個嵌套類來管理列表的節點:
(inside mylist)
class node {
T data;
node *next;
}
這是我的理解是,我不需要在node
的定義前加上template
說明符,因爲編譯器將爲mylist
的模板參數的每個組合實例化單獨的類mylist<T,A>::node
。
但是,現在我不僅需要爲T
類型的數據本身分配內存,還要爲它們的包裝node
分配內存。因此,我希望默認模板參數的類型爲std::allocator<mylist<T>::node>
。在這一點上,雖然,mylist
尚未宣佈,編譯器是可以理解打亂:
error: `mylist' was not declared in this scope
一個將如何解決這個難題?有兩個約束:
- 通常,我會宣佈缺少的類沒有完全聲明其內容。但是,由於它嵌套在我想要聲明的事物中,所以這不是一個選項。
- 我需要
node
嵌套,因爲它需要訪問分配器實例mylist
。例如,我在node
上宣佈operator=
遞歸地發生大量內存管理。這對於一個列表來說可能是過分的,你可以在mylist
之內做到這一點,從而降低node
對A
的參數依賴性,但是對於我正在實現的數據結構來說,這是至關重要的。
可能值得看看g ++如何實現'std :: list'。 –
看看分配器'rebind' – Yakk