2012-04-10 6 views
3

"SortedList"の子である "LinkedSortedList"クラスが必要です。 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

次のように、クラス定義の外側テンプレートメソッドの本体を定義することができる: テンプレートクラスプリンタ{ ボイドプリントを(); }; テンプレート void Printer :: print(){...} これらの定義は別々のファイルに置くのが一般的であり、ヘッダーの末尾に含める必要があります。それらはコンパイルされていないので、foo.hのインライン定義の典型的な命名規則はfoo_inl.hです。 –

+0

あなたのクラス本体の外にメンバー関数を定義することができますが、私はそれが不合理ではないと思う、好きなだけの問題だよ。 – SirGuy

2

あなたのLinkedSortedListはタイプintでのみ動作すると仮定します(そうでない場合は、それは自分でテンプレートする必要があります)。

最初に、sorted_list.cpp(またはテンプレートが実装されていても)の時点でSortedList<int>をコンパイルする必要があることをコンパイラが知る必要があります。コンパイルされると、リンカーはそれを見つけ、それをうまくリンクすることができます。ことができます。また

(それは良い方法です):あなたは、この行を含める必要があります最後にsorted_list.cpp

#include "sorted_list.h" 

class LinkedSortedList : public SortedList<int> { 
    ... 
} 

、:

のでlinked_sorted_list.hであなたのようなものを持っているでしょうテンプレートの定義を特別な拡張子(私は.iccを使用する傾向があります)に入れて、sorted_list.hに含まれるファイルに入れます:

template <class type> 
class SortedList { 
    ... 
} 

#include "sorted_list.icc" 

これで、並べ替えられたリストの種類をオンザフライでコンパイルできます。

+1

明示的なインスタンス化は 'template class SortedList ;'で行われる。 – Troubadour

+0

@トルバドールありがとう。それに応じて私の答えを編集しました。 –

関連する問題