我需要有一個類「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. 必須將模板參數設置爲類型嗎?
- 10. 模板模板類
- 11. 模板專業化其中模板類型也是一個模板
- 12. 模板類的內部類是否可以是非模板類?
- 13. 基於測試模板的類與const模板參數必須改變
- 14. 類模板中的類模板
- 15. 模板類Vs的類模板
- 16. 是否有可能有一個非模板類子類的模板類?
- 17. 不是模板類
- 18. C模板仿函子。類模板vs函數模板
- 19. 類模板+函數模板
- 20. 模板中模板類
- 21. 爲模板基類的子類模板專業化
- 22. 模板類專業化與模板類
- 23. 檢測模板類型本身是否是模板類型
- 24. C++模板顯式實現,模板參數是類模板
- 25. C++類模板是一個模板:模板參數無效
- 26. 返回模板子類
- 27. C++靜態模板子類
- 28. 調用從模板子類
- 29. 子類模板錯誤(C++):
- 30. Woocommerce子類別模板
可以定義的模板的方法體內的類定義之外如下: 模板 類打印機{ 空隙打印(); }; 模板 無效打印機打印::(){...} 是很常見的把這些定義在一個單獨的文件,他們_must_包含在你的頭的結束。由於它們沒有被編譯,所以foo.h的內聯定義的典型命名約定是foo_inl.h –
2012-04-10 02:23:25
我意識到你可以在你的類體外定義你的成員函數,但是我從來沒有在一個單獨的文件中看到它們的定義。我想這不是不合理的做法,只是一個優先事項 – SirGuy 2012-04-10 02:29:02