我需要有一個類「LinkedSortedList」,它是「SortedList」的子類。 SortedList是一個模板類,所以我怎麼能有一個不是模板的孩子呢?這裏唯一的問題是我需要LinkedSortedList.h和.cpp,但顯然你不能將模板的定義放在.cpp中,它們必須用.h中的方法/函數聲明來定義,所以我將不會有LinkedSortedList.cpp ....或者我只是一個完全白癡?模板類的孩子也必須是模板類嗎?
回答
您只能從完全定義的類而不是類模板派生。這意味着代碼
template <class C>
struct A{};
struct B : public A{};
無效。但是,
struct B : public A<int>{};
template <class C>
struct B : public A<C>{};
是有效的。所以看起來你會被卡在模板中。如果確實想要一個.cpp文件,您可以將您的代碼移動到一個.cpp文件中,然後將其包含在您的.h文件中(在您的類定義之後)。我不真的推薦它,因爲(IMO)它混淆了你的代碼。
那麼讓我們假設你的LinkedSortedList
只適用於int
(否則它需要自己模板)。
首先,編譯器需要知道SortedList<int>
必須在sorted_list.cpp
(或無論模板是否實現)可用時編譯。一旦編譯完成,鏈接程序將找到並能夠成功鏈接它。
所以linked_sorted_list.h
你會是這樣的:
#include "sorted_list.h"
class LinkedSortedList : public SortedList<int> {
...
}
在sorted_list.cpp
,到了最後,你必須加入這一行:
或者(這是更好的辦法),你可以將模板的定義放入一個特殊擴展的文件中(我傾向於使用.icc
),該文件包含在sorted_list.h
中:
template <class type>
class SortedList {
...
}
#include "sorted_list.icc"
現在,您可以即時編譯任何類型的排序列表。
顯式實例化是通過'template class SortedList
@Troubadour謝謝。相應地編輯了我的答案。 – 2012-04-16 19:47:29
- 1. 也是模板的模板類和類屬性
- 2. 爲什麼模板必須在類
- 3. 模板類中的模板構造函數必須在類定義中定義?
- 4. 是派生對象的模板基類型模板的子類
- 5. 「類模板」 與 「模板類」
- 6. 必須將模板參數設置爲類型嗎?
- 7. 模板模板類
- 8. 模板專業化其中模板類型也是一個模板
- 9. 基於測試模板的類與const模板參數必須改變
- 10. 是否有可能有一個非模板類子類的模板類?
- 11. C模板仿函子。類模板vs函數模板
- 12. 檢測模板類型本身是否是模板類型
- 13. C++模板顯式實現,模板參數是類模板
- 14. 返回模板子類
- 15. 模板變量是否可以用作模板參數(類似於類模板)?
- 16. 參考非靜態成員函數必須在模板類
- 17. 無模板變量的模板類型和使用此類模板的其他模板類型
- 18. 帶模板的類模板專業化
- 19. 非模板類的模板方法
- 20. 非模板類中的函數模板
- 21. C++模板類的模板專門化
- 22. 帶特徵模板的類模板
- 23. 如何定義模板類的模板
- 24. 作爲模板參數的模板類
- 25. 模板模板類的參數
- 26. 導出模板類的模板函數
- 27. 模板類的專用模板函數
- 28. 模板類的靜態模板字段?
- 29. 如何聲明模板類的模板
- 30. 模板類中的模板函數
可以定義的模板的方法體內的類定義之外如下: 模板 類打印機{ 空隙打印(); }; 模板 無效打印機打印::(){...} 是很常見的把這些定義在一個單獨的文件,他們_must_包含在你的頭的結束。由於它們沒有被編譯,所以foo.h的內聯定義的典型命名約定是foo_inl.h –
2012-04-10 02:23:25
我意識到你可以在你的類體外定義你的成員函數,但是我從來沒有在一個單獨的文件中看到它們的定義。我想這不是不合理的做法,只是一個優先事項 – SirGuy 2012-04-10 02:29:02