テンプレ
Accelerated C++が11章、自分用のVector Vecを作るところで詰まる。
自分で作ったVec.cppと、main.cppが上手くリンクできない。
テンプレート周りなので、もうちょっと簡単なプログラムで挑戦。
分かったことは、同じファイルに全部詰め込むとOK、テンプレートの実装が
別ファイルだとリンクできない。
そういえば、C++テンプレートってどのタイミングでオブジェクトファイルになるんだ。
テンプレートのみのcppファイルをコンパイルして、ラベルを見ても一つも
ラベルがない。
テンプレートを呼び出している側は、その型の呼び出しのラベル有り。
もうちょっと具体例
mmaxという大きい値を返すテンプレート関数を呼び出すmain側は
> nm main.o | c++filt | grep mmax
U double mmax
U int mmax
で、それぞれの型(int型での呼び出しと、double型の呼び出し)のラベルがあるけど、
それを定義しているmmax.cppには、なんにもラベルがない。
mmax.cppのファイルの中はこんな感じ
template<class T> T mmax(T a, T b);
template<class T> T mmax(T a, T b)
{
return (a >= b) ? a : b;
}
先にテンプレートの仕組みを持ったオブジェクトファイルがあって、リンク時に
上手い仕組みが働くと思ったのだが違うようだ。
The comments to this entry are closed.


Comments