私は静的ライブラリに取り組んでおり、ライブラリには複数のクラステンプレートと関数テンプレートがあります。静的ライブラリ内のテンプレートを使用するには、すべて(宣言/定義)がヘッダーファイルに含まれている必要があることを理解しています。ただし、この特定のケースでは、特殊化のタイプを知っているので、代わりに前方宣言を使用できると思いました。
このトリックはクラステンプレート(およびその関数)でうまく機能し、アプリケーションコードからすべてのライブラリ関数を使用できます。ただし、ライブラリ内に無料の関数テンプレートを導入し、アプリケーションコードから無料のテンプレート関数を使用しようとすると、リンカーエラーが発生します。
エラーLNK2019:未解決の外部シンボル "class TemplatedStaticLib __cdecl HelpingRegistration(int)"(?? $ HelpingRegistration @ H @@ YA?AV?$ TemplatedStaticLib @ H @@ H @ Z)関数_main 1> C:\ src\cppで参照\ vs2008 \ StaticLibExample \ MathFuncsLib \ Debug \ TemplatedStaticLibApp.exe:致命的なエラーLNK1120:1つの未解決の外部 "VS2008を使用しています、ここにコードがあります
//静的ライブラリヘッダーファイル(.h)
#ifndef _TEMPLATED_STATIC_LIB_
#define _TEMPLATED_STATIC_LIB_
#include <iostream>
template<typename T>
class TemplatedStaticLib
{
public:
TemplatedStaticLib(){};
~TemplatedStaticLib(){};
void print(T t);
};
template<typename T>
TemplatedStaticLib<T> HelpingRegistration(T);
#endif
//静的ライブラリクラスファイル(.cpp)
#include "TemplatedStaticLib.h"
//Specialization
template class TemplatedStaticLib<double>;
template class TemplatedStaticLib<int>;
template class TemplatedStaticLib<std::string>;
template<typename T>
void TemplatedStaticLib<T>::print(T t)
{
std::cout << "Templated Print " << typeid(t).name() << std::endl;
}
void HelpingRegistration(void)
{
}
//Specialization of free function
template<> TemplatedStaticLib<int> HelpingRegistration<int>(int);
template<> TemplatedStaticLib<double> HelpingRegistration<double>(double);
template<> TemplatedStaticLib<std::string> HelpingRegistration<std::string>(std::string);
template<typename T>
TemplatedStaticLib<T> HelpingRegistration(T t)
{
std::cout << "Function Templated Print " << typeid(t).name() << std::endl;
return t;
}
//アプリケーションコード
#include "TemplatedStaticLib.h"
int main(int argc, char* argv[])
{
int anInt = 99;
TemplatedStaticLib<int> test;
test.print(anInt);//works
double aDouble = 3.9;
TemplatedStaticLib<double> double_test;
double_test.print(aDouble); //works
std::string aString = "James";
TemplatedStaticLib<std::string> string_test;
string_test.print(aString);//works
//The following lines gives linker error
HelpingRegistration(anInt);
HelpingRegistration(aDouble);
HelpingRegistration(aString);
return 0;
}
なぜ違うのか、どうすれば修正できるのかわかりません。どんな助けでも大歓迎です。