ほとんどのC++処理系ではtemplateの実装は
コンパイル・ユニット内になくてはなりません。
--- foo.h ---
template<typename T>
class Foo {
public:
T data;
Foo(T x);
};
--- foo.cpp ---
#include "foo.h"
template<typename T>
Foo<T>::Foo(T x) : data(x) {}
--- main.cpp ---
#include "foo.h"
int main() {
Foo<int> fi(5);
...
}
main.cpp, foo.cpp をコンパイル/リンクしても
コンストラクタ Foo<int>::Foo が見つかんねぇ! ってリンカがぶーたれます。
そらそーです、foo.cppのコンパイル時にT=intだってことが知らされてないので
コンパイルできませんからねぇ。
このプログラム内で使われているのがFoo<int>だけってことがあらかじめ
わかっているなら foo.cpp の末尾に:
template class Foo<int>;
の一行を追加することで、Foo<int>を生成させることができます。
ライブラリ作る時に役に立つかもですね。
文字列操作クラス/関数をこしらえ、T=char, T=wchar_t の二種類で
十分だってことがわかってる、なんてときならライブラリ・ヘッダから
実装を隠して詮索好きな利用者からか弱いプログラマを守ることができやす。