テンプレート関数の呼び出しについてご質問があります

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
taketoshi
記事: 222
登録日時: 15年前
住所: 日本国

テンプレート関数の呼び出しについてご質問があります

#1

投稿記事 by taketoshi » 14年前

こんにちは。テンプレート関数を書いたのですが、LNK2019エラーが出てしまって困っています。

にっちもさっちもいかないので、試しに以下の様にテストコードを書いてみました。
ただ引数を受け取ってメッセージボックスを出すだけのコードです。

コード:

/////////////////////////////////////////////////////////////////////////////////////////////////////
//クラス名		:DataHunger
/////////////////////////////////////////////////////////////////////////////////////////////////////
class DataHunger:public CommonData{
	//testコード
	BOOL Test(int);
	template<typename X>BOOL Test2(X);
};

//普通のメンバ関数の定義
BOOL DataHunger::Test(int x){
	MessageBox(NULL,"test","test",MB_OK);
	return true;
}

//テンプレート関数
template<typename X>BOOL DataHunger::Test2(X x){
	MessageBox(NULL,"test","test",MB_OK);
	return true;
}


//インスタンスの生成、メソッドの呼び出し
BOOL Debug::GetDebugData(){
             
             DataHunger dh;
	dh.Test(1);
	dh.Test2(1);

            省略
            return true;
}

これを実行すると。
以下の様にリンクエラーが出てしまいます。

1>Debug.obj : error LNK2019: 未解決の外部シンボル "public: int __thiscall DataHunger::Test2<int>(int)" (??$Test2@H@DataHunger@@QAEHH@Z) が関数 "public: int __thiscall Debug::GetDebugData(void)" (?GetDebugData@Debug@@QAEHXZ) で参照されました。

普通のメンバ関数である、Test関数はコンパイルが通って、テンプレート関数で怒られているようです。
テンプレート関数を呼び出す動作をコメントアウトすると普通に動作して、メッセージボックスが表示されます。
ただ、書き方が違うだけで、やってることは一緒だと思うのですが、なぜコンパイルできないのでしょう・・・。

ご指導お願いいたします。

taketoshi
記事: 222
登録日時: 15年前
住所: 日本国

Re: テンプレート関数の呼び出しについてご質問があります

#2

投稿記事 by taketoshi » 14年前

ここの過去ログを読み返したら同様の質問があって自己解決いたしました。

ヘッダファイルにて関数を定義したところ、動作しました。
テンプレートはヘッダで定義が基本なんですねぇ。

閉鎖

“C言語何でも質問掲示板” へ戻る