で宣言され、で定義された非型テンプレート関数f(int)
(パラメータ) があるとします。でさらにの特殊化を 1 つ追加し、 と のテンプレート関数を明示的にインスタンス化します。<int dim>
template.h
template.cpp
template.cpp
dim = 2
dim = 1
dim = 2
ファイルは正常にコンパイルされますが、リンク プロセス中にエラーが発生します。
Undefined symbols for architecture x86_64:
"void f<2>(int)", referenced from:
_main in main-2AW7ED.o
ld: symbol(s) not found for architecture x86_64
inline
ただし、テンプレートの特殊化 (下のマークを参照) からキーワードを削除すると、すべてが期待どおりに機能します。だからここに私の質問があります:
inline
ベーステンプレートでは機能するのに、他のすべてがコンパイルされて正常に機能するのに、特殊なテンプレートでは機能しないのはなぜですか?
main.cpp
#include <iostream>
#include "template.h"
using namespace std;
int main(int, char** )
{
f<1>(456);
f<2>(789);
}
template.h
template <int dim> void f(int src);
テンプレート.cpp
#include <iostream>
#include "template.h"
using namespace std;
template <int dim> inline
void f(int src)
{
cout << "src = " << src << endl;
cout << "dim (template) = " << dim << endl;
}
template <> inline // <== if I remove this "inline", everything works as expected
void f<2>(int src)
{
cout << "src = " << src << endl;
cout << "dim (fixed) = " << 2 << endl;
}
template void f<1>(int);
template void f<2>(int);
clang++ -o tmpl template.cpp main.cpp
PS:コンパイルするコマンドで g++ と clang++ を使用しました。