「SortedList」の子であるクラス「LinkedSortedList」が必要です。SortedList はテンプレート クラスなので、テンプレートではない子を持つにはどうすればよいでしょうか? ここでの唯一の問題は、LinkedSortedList.h と .cpp の両方が必要なことですが、テンプレートの定義を .cpp に残すことはできないようです。.h 内のメソッド/関数宣言で定義する必要があるため、 LinkedSortedList.cpp はありません....それとも私は完全なばかですか?
2 に答える
LinkedSortedList
あなたがタイプのみを扱うと仮定しましょint
う(そうでなければ、それ自体がテンプレートである必要があります)。
最初に、コンパイラは、それが利用可能SortedList<int>
になった時点sorted_list.cpp
(またはテンプレートが実装されている場所) でコンパイルする必要があることを認識する必要があります。コンパイルされると、リンカーはそれを見つけて、正常にリンクできるようになります。
したがって、linked_sorted_list.h
次のようなものがあります。
#include "sorted_list.h"
class LinkedSortedList : public SortedList<int> {
...
}
ではsorted_list.cpp
、最後に次の行を含める必要があります。
template class SortedList<int>;
別の方法として (それがより良い方法です)、テンプレートの定義を、に含まれる特別な拡張子 (私は を使用する傾向があります.icc
) を持つファイルに入れることができますsorted_list.h
。
template <class type>
class SortedList {
...
}
#include "sorted_list.icc"
あらゆるタイプのソート済みリストをその場でコンパイルできるようになりました。
クラス テンプレートではなく、完全に定義されたクラスからのみ派生できます。これはコードを意味します
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)コードが難読化されるため、あまりお勧めしません。