« 今日の読書 | Main | 今日の日記 »

2006.08.29

テンプレ

Accelerated C++が11章、自分用のVector Vecを作るところで詰まる。
自分で作ったVec.cppと、main.cppが上手くリンクできない。

テンプレート周りなので、もうちょっと簡単なプログラムで挑戦。
分かったことは、同じファイルに全部詰め込むとOK、テンプレートの実装が
別ファイルだとリンクできない。

そういえば、C++テンプレートってどのタイミングでオブジェクトファイルになるんだ。
テンプレートのみのcppファイルをコンパイルして、ラベルを見ても一つも
ラベルがない。
テンプレートを呼び出している側は、その型の呼び出しのラベル有り。

もうちょっと具体例
mmaxという大きい値を返すテンプレート関数を呼び出すmain側は

> nm main.o | c++filt | grep mmax
U double mmax(double, double)
U int mmax(int, int)
で、それぞれの型(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;

}

先にテンプレートの仕組みを持ったオブジェクトファイルがあって、リンク時に
上手い仕組みが働くと思ったのだが違うようだ。

|

« 今日の読書 | Main | 今日の日記 »

Comments

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/18154/11662814

Listed below are links to weblogs that reference テンプレ:

« 今日の読書 | Main | 今日の日記 »