【发布时间】:2012-07-02 02:43:20
【问题描述】:
我整天都被这个问题难住了。基本上我想检查以确认模板类型继承自一个适用于我正在做的事情的类。为此,我使用了 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
【问题讨论】:
-
复制并粘贴您遇到的错误。
-
这很奇怪,因为我可以通过将代码放在头文件中来消除错误,但这不是一个很好的解决方案
-
所有模板代码必须在标题中。这就是 C++ 的工作方式。
-
哦,真的。这似乎有点奇怪。我试试看
标签: templates inheritance enable-if