3

「SortedList」の子であるクラス「LinkedSortedList」が必要です。SortedList はテンプレート クラスなので、テンプレートではない子を持つにはどうすればよいでしょうか? ここでの唯一の問題は、LinkedSortedList.h と .cpp の両方が必要なことですが、テンプレートの定義を .cpp に残すことはできないようです。.h 内のメソッド/関数宣言で定義する必要があるため、 LinkedSortedList.cpp はありません....それとも私は完全なばかですか?

4

2 に答える 2

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"

あらゆるタイプのソート済みリストをその場でコンパイルできるようになりました。

于 2012-04-10T02:35:36.473 に答える
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)コードが難読化されるため、あまりお勧めしません。

于 2012-04-10T02:17:28.297 に答える