以下のコードをコンパイル・リンクすると
Ent.obj : error LNK2019: 未解決の外部シンボル public: void __thiscall
Test<int>::function(int) (?function@?$Test@H@@QAEXH@Z) が関数 _main で参照され
ました。
というエラーが出て失敗してしまいます。(コンパイルエラーはないようです)
Test.h・Test.cppの中身もEnt.cppに書き込めばリンクできるのですが、あまりそうはし
たくないです。テンプレートクラスは宣言と実装を別のファイルに分けられないのでし
ょうか
初歩的な質問ですみませんがよろしくお願いします。
(VC++2005Express・WindowsXPです)
//Test.h
#pragma once
template <typename T> class Test{
public:
void function(T param);
};
//Test.cpp
#include StdAfx.h
#include Test.h
template<typename T>
void Test<T>::function(T param){
printf(Template);
}
//Ent.cpp
#include stdafx.h
#include Test.h
int main(){
Test<int> *t = new Test<int>();
t->function(100);
delete t;
}
つ http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200109/01090038.txt
もしくは、.cppを.h内でinclude
テンプレートって実際に使用しているのをみて、
void Test<T>::function(T param){
printf(Template);
}
のTをintに置き換えた
void Test<int>::function(int param){
printf(Template);
}
を作成する仕組みなので
このままではTest<int>::function(int)が存在しないんですよ。
FAQですが、別ファイルにすることはできても結局includeが必要ですので、
現実的には、いわゆる宣言と実装の分離はできないです。
Test<int>以外絶対に使われないことがあらかじめわかっているならば:
//Test.cpp
#include StdAfx.h
#include Test.h
template<typename T>
void Test<T>::function(T param){
printf(Template);
}
template class Test<int>; // この一行追加。
過去ログにありましたか... すみません。
ヘッダファイルに実装を書くようにしたいと思います。
皆様ありがとうございました。