5

重複の可能性:
C ++テンプレート関数定義を.CPPファイルに保存
するテンプレートをヘッダーファイルにのみ実装できるのはなぜですか?
テンプレートクラスの実装と宣言を同じヘッダーファイルに含める必要があるのはなぜですか?

私は3つのファイルを持っています。1つは、base.hで、テンプレートを利用するメンバーがいるクラスがあります。

class Base {
    protected:
        template <class T>
            void doStuff(T a, int b);
};

base.cppで、Base :: doStuff()を実装します。

#include "base.h"

template <class T>
void Base::doStuff(T a, int b) {
    a = b;
}

次に、これをプロジェクトの別のクラスで使用しようとします。

#include "base.h"

void Derived::doOtherStuff() {
    int c;
    doStuff(3, c);
}

しかし、「doStuff(int、int)」が見つからないことを示すリンクエラーが発生します

私が見たところ、これはC ++ 03では、この関数の実装をヘッダーファイルに移動しないと不可能です。これを行うためのクリーンな方法はありますか?(C ++ 11x機能を使用しても問題ありません)。

4

1 に答える 1

4

Its a common idiom to place template definitions into an .inl file along with inline function definitions, and include it at the end of .h file:

base.h

#ifndef BASE_H
#define BASE_H

class Base {
    protected:
        template <typename T>
        void doStuff(T a, int b);
};

#include "base.inl"

#endif

base.inl

template <typename T>
void Base::doStuff(T a, int b) {
    a = b;
}
于 2012-07-26T20:11:39.007 に答える