これらは私のファイルです:
-------- [c.hpp] --------
#ifndef _C
#define _C
#include<iostream>
class C
{
public:
template<class CARTYPE> void call(CARTYPE& c);
};
#endif
-------- [c.cpp] --------
#include "c.hpp"
template<class CARTYPE> void C::call(CARTYPE& c)
{
//make use of c somewhere here
std::cout<<"Car"<<std::endl;
}
-------- [v.cpp] --------
class Merc
{};
-------- [main.cpp] --------
#include "c.hpp"
#include "v.cpp"
//#include "c.cpp"
int main()
{
Merc m;
C someCar;
someCar.call(m);
}//main
コマンドg++-cmain.cppおよびg++-c c.cppなどを使用して、上記のすべてのファイルに対して「.o」ファイルを生成できます。しかし、「。o」ファイルをg ++ -o car co main.o voにリンクしようとすると、次のエラーが発生します。
main.o: In function `main':
main.cpp:(.text+0x17): undefined reference to `void C::call<Merc>(Merc&)'
collect2: ld returned 1 exit status
main.cppの#include"c.cpp"のコメントを外すとエラーはなくなりますが、この方法でcppファイルを含めるのは悪い習慣かもしれません。私はこれを間違っていますか?個別のオブジェクトファイルを作成してそれらをリンクしながら、テンプレート化された宣言に対応するためのより良い方法はありますか?ps:私ははるかに複雑なクラス構造でテンプレート化された関数を使用しています。ここに示されているのは、私が直面しているエラーの種類を示すためのほんの小さな例です。