0

私はこの問題で一日中困惑しています。基本的に、テンプレートの型が、私がやっていることで機能するクラスから継承されていることを確認したいと思います。これを行うには、std::enable_if を使用しました。コンパイル時に希望どおりに動作するものがありますが、クラスで実際に何かを実行しようとすると、未定義の参照エラーが発生し続けます。

class TrainingCompare
{
public:
    virtual bool operator() (PUnitType& lhs, PUnitType& rhs)=0;
};

// The following Magic will result in a type error if T does not inherit from TrainingCompare
template<class T, class Enable = void>
class TrainAction;

template <class T>
class TrainAction<T,
    typename std::enable_if< std::is_base_of< TrainingCompare, T >::value>::type>
    : public BasicAction
{
    priority_queue<UnitType, vector<PUnitType>, T> trainQueue;
public:
    TrainAction();
    void addUnitRequest(UnitType uType, int priority = 0);
};

ソースファイルをコンパイルするのは難題でしたが、私が思いついたのは、たくさんあるのはまったくがらくたのように見えたので、コードを縮小するマクロを作成しました.

#include "TrainAction.h"

#define Magic(rtype) template <class T>\
    rtype TrainAction<T, typename std::enable_if< std::is_base_of< TrainingCompare, T >::value>::type>

template<class T>
TrainAction<T, typename std::enable_if< std::is_base_of< TrainingCompare, T >::value>::type>::TrainAction()
{
    group = NULL;
}

Magic(void)::addUnitRequest(UnitType uType, int priority = 0)
{
    trainQueue.push(PUnitType(UnitType));
}

マクロは間違っているが、ヘッダーは正しいと感じていますが、それはただの勘です。前もって感謝します。

1>ExampleAIModule.obj : error LNK2001: unresolved external symbol "public: void __thiscall TrainAction<class TrainComp,void>::addUnitRequest(class BWAPI::UnitType,int)" (?addUnitRequest@?$TrainAction@VTrainComp@@X@@QAEXVUnitType@BWAPI@@H@Z)
1>ExampleAIModule.obj : error LNK2001: unresolved external symbol "public: __thiscall TrainAction<class TrainComp,void>::TrainAction<class TrainComp,void>(void)" (??0?$TrainAction@VTrainComp@@X@@QAE@XZ)
1>C:\bwapi4\broodwarbot\branches\DR_BWAIModule\Release\ExampleAIModule.dll : fatal error LNK1120: 2 unresolved externals
4

1 に答える 1

0

問題は、すべてのテンプレート コードがヘッダーに含まれている必要があることです。

于 2012-07-04T18:10:37.723 に答える