6

テンプレート化された dllexport 関数を定義できるかどうかを知りたいです。今まで関数はテンプレート化されていませんでしたが、正常に動作しています。コードは次のとおりです。

モジュール.cpp:

#if defined(__cplusplus)
    #define DLL_Export extern "C" __declspec(dllexport)
#else /* __cplusplus */
    #define DLL_Export __declspec(dllexport)
#endif /* __cplusplus */
...
VirtualTPM * virtual_tpm;
...
DLL_Export void TestPointModule_Check(string name, void * value){
    virtual_tpm->CheckTestPoint(name, value);   
}

ただし、他のデータ型を管理するには TestPointModule_Check 関数を拡張する必要があるため、テンプレート化された CheckTestPoint(...) 関数を作成し、これを試しました。

モジュール.cpp:

...
template <typename T>
DLL_Export void TestPointModule_Check(string name, void * value){
    virtual_tpm->CheckTestPoint<T>(name, value);    
}

しかし、これにより次のエラーが発生します: エラー C2988: 認識できないテンプレート宣言/定義

エラーなしVirtualTPM::CheckTestPoint<T>で a を呼び出すことができるため、 は正しく定義されています。virtual_tpm->CheckTestPoint<int>(name, value);

私が必要とすることを行う方法はありますか?テンプレートを 4 つの異なるデータ型に制限することができます (実際、VirtualTPM::CheckTestPoint<T>関数のテンプレートを定義するときにこれを行いましたが、その方法がわかりません。

4

3 に答える 3

1

@Jhonnyがすでに指摘したことに加えて、次のように言うことができるはずです:

...
template <>
DLL_Export void TestPointModule_Check<AParticularType>
                    (string name, AParticularType* value) {
    virtual_tpm->CheckTestPoint<AParticularType>(name, value);  
}

ヘッダーに追加:

template<typename T>
void TestPointModule_Check(string name, T* value);

と:

template <>
DLL_Export void TestPointModule_Check<AParticularType>
                    (string name, AParticularType* value);

また、C++ からエクスポートするためにマクロ定義を酷使します。

#if !defined(__cplusplus)
//  ^ Note
#define DLL_Export extern "C" __declspec(dllexport)
#else /* __cplusplus */
#define DLL_Export __declspec(dllexport)
#endif /* __cplusplus */

このトピックに関する追加情報を見つけるには、このリンクまたはこのリンクを参照してください

于 2013-10-30T14:00:15.407 に答える