2012-04-10 80 views
3

我需要有一個類「LinkedSortedList」,它是「SortedList」的子類。 SortedList是一個模板類,所以我怎麼能有一個不是模板的孩子呢?這裏唯一的問題是我需要LinkedSortedList.h和.cpp,但顯然你不能將模板的定義放在.cpp中,它們必須用.h中的方法/函數聲明來定義,所以我將不會有LinkedSortedList.cpp ....或者我只是一個完全白癡?模板類的孩子也必須是模板類嗎?

回答

0

您只能從完全定​​義的類而不是類模板派生。這意味着代碼

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)它混淆了你的代碼。

+0

可以定義的模板的方法體內的類定義之外如下: 模板 類打印機{ 空隙打印(); }; 模板 無效打印機打印::(){...} 是很常見的把這些定義在一個單獨的文件,他們_must_包含在你的頭的結束。由於它們沒有被編譯,所以foo.h的內聯定義的典型命名約定是foo_inl.h – 2012-04-10 02:23:25

+0

我意識到你可以在你的類體外定義你的成員函數,但是我從來沒有在一個單獨的文件中看到它們的定義。我想這不是不合理的做法,只是一個優先事項 – SirGuy 2012-04-10 02:29:02

2

那麼讓我們假設你的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" 

現在,您可以即時編譯任何類型的排序列表。

+1

顯式實例化是通過'template class SortedList ;'完成的。 – Troubadour 2012-04-16 18:08:05

+0

@Troubadour謝謝。相應地編輯了我的答案。 – 2012-04-16 19:47:29