有時實例化具有不完整類型的標準容器以獲得遞歸結構很有用:struct multi_tree_node { // Does work in most implementations std::vector< multi_tree_node > child;};struct trie_node { // Does not work in most implementations std::map< char, trie_node > next;};因為容器沒有類型value_type或成員函數來value_type按值傳遞或返回任何對象的成員,所以這種方法趨于起作用。標準似乎對不完整的模板參數沒有說太多,但是在C ++ 11§17.6.4.8[lib.res.on.functions]中有一點,“其他函數的要求”:特別是,在以下情況下,效果是不確定的:…如果在實例化模板組件時將不完整類型(3.9)用作模板參數,除非該組件特別允許。即使實例不在塊范圍內,這也使上述構造非法嗎?這是否屬于“對用于實例化標準庫模板組件的類型的操作”(也是17.6.4.8)?還是在所有特別要求的實例化成功后,禁止庫實現產生可能因不完整類型而失敗的模板實例化?編輯:由于只有函數可以調用和實例化其他函數,所以將“對類型的操作…”限制為塊范圍內的那些似乎會使成員函數的內容比簽名和成員類定義的內容嚴格。畢竟,在類型完成之前,對a 做任何事情當然是沒有意義的multi_tree_node。甚至擴展到std::unique_ptr,即使在塊范圍中使用,它也顯式支持不完整的類型參數。編輯2:為我服務,不用打擾測試trie_node示例-甚至我以前都嘗試過。它與@Ise鏈接的文章中的損壞示例相同。但是,盡管這篇文章似乎認為“什么都行不通”是理所當然的,但對我而言,解決方案似乎很簡單- std::map內部tree_node類應該是非成員模板,而不是成員非模板類。無論如何,那篇文章很好地確立了設計意圖,所以我猜我對“功能要求”子標題下的看法只是這樣。
2 回答

肥皂起泡泡
TA貢獻1829條經驗 獲得超6個贊
就我個人而言,我覺得在17.6.4.8/2中實例化的措辭有點含糊,但是根據 本文,標準的意圖似乎不允許使用標準容器的遞歸數據類型。
在相關說明中,VC2005 class C { std::deque< C > x; };在編譯時會 發出的錯誤 class C { std::vector< C > x; };。
但是,據我了解,此限制僅是為了擴展實現標準容器的自由度。因此,正如Kerrek SB所提到的,可以有一些容器允許遞歸數據結構,而 Boost.Container 似乎提供了這種功能。

小唯快跑啊
TA貢獻1863條經驗 獲得超2個贊
這是我的一種解釋嘗試:
該標準只是說您不必執行此操作,即使任何給定的具體實現都可能在支持這種構造上沒有問題。但是,例如,假設有人想編寫一個“小向量”優化方法,即向量始終包含五個元素的空間。您馬上就會遇到麻煩,因為您將擁有一個自引用類型。即使向量根據值類型的大小采用某種靜態分支,這也將是一個問題。
因此,為了不使實現不包含此類構造,該標準僅聲明您必須僅使用完整類型。換句話說,大多數容器僅包含對值類型的引用或指針這一事實是實現細節,而不是標準要求。
只是為了澄清這一點:如果定義自己的類模板,則完全有可能以明確支持不完整類型的方式進行設計。該標準的一個示例是std::unique_ptr,它對不完整的類型參數T[](甚至void)非常滿意。
- 2 回答
- 0 關注
- 546 瀏覽
添加回答
舉報
0/150
提交
取消