ヘッダー ファイルで関数テンプレートが定義されているとします。#include
ここで、このヘッダーに2 つの実装ファイルがあり、それぞれに関数テンプレートへの呼び出しがあるとします。どちらの実装ファイルでも、関数テンプレートは同じ型でインスタンス化されています。
// header.hh
template <typename T>
void f(const T& o)
{
// ...
}
// impl1.cc
#include "header.hh"
void fimpl1()
{
f(42);
}
// impl2.cc
#include "header.hh"
void fimpl2()
{
f(24);
}
リンカが の複数の定義について不平を言うと予想されるかもしれませんf()
。具体的にはf()
、テンプレートではない場合は、実際にそうです。
- リンカーが の複数の定義について文句を言わないのは
f()
なぜですか? - リンカーがこの状況を適切に処理しなければならないことが標準で指定されていますか? 言い換えれば、上記のようなプログラムをコンパイルしてリンクすることを常に期待できますか?
- リンカーが一連の関数テンプレートのインスタンス化を明確にするのに十分なほど賢い場合、インスタンス化された関数テンプレートの場合と同じであるのに、通常の関数に対して同じことができないのはなぜですか?