DLL使用のためにこのテンプレート関数明示的なインスタンス化を行うにはどうすればよいですか?
-
29-09-2019 - |
質問
次のクラスとテンプレート機能があります。
template <size_t num>
class String{
public:
char charArray[num];
};
template <size_t num,typename T>
void getString(String<num> & string,T number){
cout <<string.charArray<<' '<<number<<'\n';
}
その後、DLLにそのインスタンス化をエクスポートするために、次のように明示的なインスタンス化を行おうとしましたが、ついに、私がしようとしていた場所でリンカーによって未解決の外部シンボルのリンカーエラーが得られたため、それはまったくインスタンス化されなかったことがわかりましたその関数をインポートして使用します(正確なリンカーエラー: "未解決の外部シンボル "__declspec(dllimport)void _cdecl getString <5>(class string <5>&、unsigned char)(_imp _ ?? $ getString@$ 04 @@ yaxaav?$ string@$ 04 @@ e@z)")「num"がインスタンス化するつもりだった時点で指定されていなかったからです。そもそも私はそれを考えていました。 String<num> & string
ポインターとして実装されます。次の構文はインスタンス化でしたが、私は間違っていたようです。
template<size_t num>
__declspec(dllexport) void getString(String<num> & string,unsigned char number);
地球上で見つかったすべての整数数に対して確かにそれをするつもりはないので、私はインスタンスを行うべきであることをどのように提案しますか!!!。
解決 2
それが何であるかは、最初から間違ったデザインです。私がやったことは明示的なインスタンス化ではありません。なぜなら、「size_t num」の異なる値でさえ、関数の異なるインスタンスが最初は考えていたものとは反対に生成されるのでこのデザインでは、私の種類の明示的なインスタンス化は不可能です。正しい設計の場合、関数の最初のパラメーターは、「TypeName T」の異なるタイプで明示的なインスタンス化を可能にするための配列である必要があります。正しいデザインは次のとおりです。
template <typename T>
void getString(char string[],T number){
cout <<string<<' '<<number<<'\n';
}
template __declspec(dllexport) void getString(char string[],unsigned char number);
他のヒント
任意のパラメーターをインスタンス化できるようにしたい関数テンプレートの場合は、ソースファイルに入れないでください。代わりにヘッダーファイルに入れます。
義務的なリンク:
あなたのヘッダーで宣言します:
template <size_t num,typename T>
void getString(String<num> & string,T number);
あなたの中でCPPファイルを定義します:
template <>
void getString<42,int>(String<42,int> & string, int number){
cout <<string.charArray<<' '<<number<<'\n';
}