これは、私が抱えている問題を示すための単純化されたコードです。
特定の固定されたインスタンス化のみをコンパイルしたいテンプレート関数があります。
関数宣言は次のとおりです。
// *** template.h ***
int square (int x);
double square (double x);
定義は次のとおりです。
// *** template.cpp ***
#include "template.h"
// (template definition unusually in a code rather than header file)
template <typename T>
T square (T x)
{
return x*x;
}
// explicit instantiations
template int square (int x);
template float square (float x);
そして、使用例は次のとおりです。
// *** main.cpp ***
#include <iostream>
using namespace std;
#include "template.h"
int main (void)
{
cout << square(2) << endl;
cout << square(2.5) << endl;
}
これをコンパイルしようとすると、リンク エラーが発生します。
main.obj : 関数 main で参照されている未解決の外部シンボル "int square(int)"
問題の内容は理解しています。明示的なテンプレートのインスタンス化の関数シグネチャがヘッダー ファイルのものと一致しません。
明示的なテンプレートのインスタンス化の (前方) 宣言の構文は何ですか? テンプレート定義を前方宣言したり、テンプレート定義をヘッダー ファイルに移動したりしたくありません。
価値があるのは、上記のファイルに以下を追加して、ラッパー関数を使用するという回避策があります。
// *** template.cpp ***
// ...
// wrap them [optionally also inline the templates]
int square (int x) { return square<> (x); }
double square (double x) { return square<> (x); }
これはコンパイルされ、期待どおりに動作します。しかし、これは私にはハックのようです。C++ およびテンプレート構文で利用できるものよりも洗練されたものがあるはずです。
どんな助けやヒントも大歓迎です。