あばうと 電脳館
昔のひとりごと
コラム
電算室
まじっく☆ぱにっく
Destroy Block
やまづくり
インラインアセンブラについて
DirectX解説書
libjpegメモ
その他のソフトウェア
遊戯室
YS Flight Simulator
掲示板
リンク
mail
|
ひとりごと
|
2005年10月11日 23:41 (1月に沖縄で国際会議)
プログラムでtemplate使っててリンクエラーが出た.それ関連.
○例1
・hoge.h
#pragma once
template <typename T> class hoge {
public:
T func (T a, T b) {return a + b;}
};
|
・main.cpp
#include <iostream>
#include "hoge.h"
int main (void) {
hoge<int> a;
std::cout << a.func (10, 20) << std::endl;
return 0;
}
|
・問題なく通る.出力結果は30.
○例2
・hoge.h
#pragma once
template <typename T> class hoge {
public:
T func (T a, T b);
};
|
・hoge.cpp
#include "hoge.h"
template <typename T> T hoge::func (T a, T b) {return a + b;}
|
・main.cpp
さっきと同じ
・これでコンパイルするとリンクエラー
○原因
・hoge.cppコンパイル時にはTが何かわからないのでfuncの実体が生成されない
↓
・main.cppコンパイル時にはfunc<int>がどこかに存在するものとしてコンパイル
↓
・どこにも実体は無いのでリンク時にエラー
○解決策
hoge.cppコンパイル時に明示的にインスタンス化させる.
・hoge.h
さっきと同じ
・hoge.cpp
#include "hoge.h"
template class hoge<int>;
template <typename T> T hoge::func (T a, T b) {return a + b;}
|
・main.cpp
さっきと同じ
・これで問題なし.ただし,double型やfloat型にするときは実体を生成するように
またhoge.cppに明示的に記述する必要があり面倒
・あまりにも面倒ならヘッダファイルにインライン展開って手段が・・・
○参考
・【C++】template 統合スレ -- Part6 の300あたり
|
|