我整天都对这个问题感到难过。基本上我想检查以确认模板类型继承自一个适用于我正在做的事情的类。为了做到这一点,我使用了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
答案 0 :(得分:0)
问题是所有模板代码都必须在标题中。