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 回答