TemplateClassの関数が認識されない – プログラミング – Home

TemplateClassの関数が認識...
 
通知
すべてクリア

[解決済] TemplateClassの関数が認識されない


trnt
 trnt
(@trnt)
ゲスト
結合: 17年前
投稿: 2
Topic starter  

以下のコードをコンパイル・リンクすると

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;
}


引用未解決
トピックタグ
chamaro
 chamaro
(@chamaro)
ゲスト
結合: 17年前
投稿: 19
 

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200109/01090038.txt

もしくは、.cppを.h内でinclude


返信引用
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

テンプレートって実際に使用しているのをみて、
void Test<T>::function(T param){
printf(Template);
}
のTをintに置き換えた
void Test<int>::function(int param){
printf(Template);
}
を作成する仕組みなので
このままではTest<int>::function(int)が存在しないんですよ。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

FAQですが、別ファイルにすることはできても結局includeが必要ですので、
現実的には、いわゆる宣言と実装の分離はできないです。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

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>; // この一行追加。


返信引用
trnt
 trnt
(@trnt)
ゲスト
結合: 17年前
投稿: 2
Topic starter  

過去ログにありましたか... すみません。

ヘッダファイルに実装を書くようにしたいと思います。
皆様ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました