0

ファイルの内容は次のとおりです。最初にテンプレート化されたクラス: .h ファイル内:

template <class T>
class templatedClass
{
    public :

    templatedClass(T val);
    ~templatedClass() {}

    void writeV();

    T v;
};

.cpp ファイル内:

template <class T>
templatedClass<T>::templatedClass(T val)
{
    v = val;
}

template <class T>
void templatedClass<T>::writeV()
{
    std::cout << v << std::endl;
}

ビルドするときはすべて問題ありません。

継承されたクラス: .h ファイル内:

class inheritedClass : public templatedClass<float>
{
    public :

    inheritedClass(float val);
    ~inheritedClass() {}

    void write();
};

.cpp ファイル内:

inheritedClass::inheritedClass(float val)
: templatedClass<float>(val)
{

}

void inheritedClass::write()
{
    writeV();
}

ビルド時に、次のリンク エラーを受け取りました。

Undefined symbols for architecture x86_64:
  "templatedClass<float>::writeV()", referenced from:
      inheritedClass::write() in inheritedClass.o
  "templatedClass<float>::templatedClass(float)", referenced from:
      inheritedClass::inheritedClass(float) in inheritedClass.o

コードの何が問題になっていますか? 成功するには、XCode で特別なビルド オプションを使用する必要がありますか?

ご回答ありがとうございます。

4

1 に答える 1

0

テンプレート クラスのインスタンス化が欠落しているという問題があります。これを解決するには、テンプレートの実装コードをヘッダー ファイルに配置する必要があります。つまり、この部分:

template <class T>
templatedClass<T>::templatedClass(T val)
{
    v = val;
}

template <class T>
void templatedClass<T>::writeV()
{
    std::cout << v << std::endl;
}

別のテンプレート実装ファイルを保持して他の cpp ファイルに含める、またはクラス テンプレートを別の場所で完全にインスタンス化するなど、他のオプションがあります...

テンプレートをヘッダー ファイルにしか実装できないのはなぜですか? を参照してください。詳細については、クラス テンプレートのインスタンス化を参照してください。

于 2014-02-17T17:53:27.963 に答える