我是模板的新手,我已经在网上搜索了此错误,但我不知道如何解决它。 已检查Why can templates only be implemented in the header file?
State.h
template <class entityType>
class State
{
public:
State() = default;
virtual void Enter(entityType * owner);
};
EnterMine.h
#include "State.h"
class Miner;
class EnterMine : public State<Miner>
{
public:
EnterMine() = default;
virtual void Enter(Miner *) {
};
};
而Miner.cpp为空白
问题出现在main.cpp
中#include "EnterMine.h"
int main()
{
EnterMine a;
}
我得到的错误是链接错误:
LNK2001尚未解析的外部符号“ public:虚拟void __thiscall State :: Enter(类Miner *)”(?Enter @?$ State @ VMiner @@@@@ UAEXPAVMiner @@@@ Z)
答案 0 :(得分:3)
(注意:此答案是针对原始问题而写的,此后已被完全重写。)
每个声明和使用的函数都应在某个地方定义。
似乎您声明了EnterMine::EnterMine()
,但从未定义它。如果此构造函数不执行任何操作,请忽略它(它将为implicitly defined by a compiler),或将其标记为= default;
。
class EnterMine : public State<Miner>
{
public:
EnterMine() = default;
...
};
这也适用于State::State()
构造函数。
答案 1 :(得分:0)
即使是单例,您仍在调用构造函数。因此,您仍然需要定义构造函数。
实际上,您需要定义在标头中声明的每个函数。