"SortedList"の子である "LinkedSortedList"クラスが必要です。 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
でのみ動作すると仮定します(そうでない場合は、それは自分でテンプレートする必要があります)。
最初に、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"
これで、並べ替えられたリストの種類をオンザフライでコンパイルできます。
明示的なインスタンス化は 'template class SortedList
@トルバドールありがとう。それに応じて私の答えを編集しました。 –
- 1. 入れ子のテンプレートクラス
- 2. 入れ子のテンプレートクラス
- 3. 1つのテンプレートクラスから別のテンプレートクラスへの変換演算子
- 4. テンプレートクラスの友人テンプレートクラス
- 5. テンプレートクラスの代入演算子
- 6. テンプレートクラスのバイナリ演算子オーバーロード
- 7. テンプレートクラスのconst修飾子コンストラクタ
- 8. テンプレートクラスと演算子のオーバーロード
- 9. テンプレートクラス
- 10. テンプレートクラス
- 11. オーバーロード演算子=内部テンプレートクラス
- 12. テンプレートクラス関数の構文のテンプレートクラス引数
- 13. エラー:テンプレートクラス
- 14. はテンプレートクラス
- 15. はテンプレートクラス
- 16. テンプレートクラスC++
- 17. テンプレートクラス "コピーコンストラクタ"
- 18. テンプレートクラスのテンプレート演算子の友達enable_if
- 19. テンプレートクラス演算子のオーバーロードの問題
- 20. テンプレートクラス内の加算演算子のオーバーロード
- 21. 友人演算子<<テンプレートクラスのオーバーロード
- 22. テンプレートクラスの代入演算子クラス
- 23. テンプレートクラス用のインターフェイス
- 24. テンプレートクラスの継承
- 25. テンプレートクラスのデストラクタ
- 26. Android Studioのテンプレートクラス
- 27. テンプレートクラスのサイズ
- 28. テンプレートクラスのオブジェクト
- 29. テンプレートメソッド内のテンプレートクラス
- 30. テンプレートクラスのC++テンプレートコピーコンストラクタ
次のように、クラス定義の外側テンプレートメソッドの本体を定義することができる: テンプレートクラスプリンタ{ ボイドプリントを(); }; テンプレート void Printer :: print(){...} これらの定義は別々のファイルに置くのが一般的であり、ヘッダーの末尾に含める必要があります。それらはコンパイルされていないので、foo.hのインライン定義の典型的な命名規則はfoo_inl.hです。 –
あなたのクラス本体の外にメンバー関数を定義することができますが、私はそれが不合理ではないと思う、好きなだけの問題だよ。 – SirGuy