模板继承类中的虚函数

时间:2019-11-19 16:01:04

标签: c++ templates

我是模板的新手,我已经在网上搜索了此错误,但我不知道如何解决它。 已检查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)

2 个答案:

答案 0 :(得分:3)

(注意:此答案是针对原始问题而写的,此后已被完全重写。)

每个声明和使用的函数都应在某个地方定义。

似乎您声明了EnterMine::EnterMine(),但从未定义它。如果此构造函数不执行任何操作,请忽略它(它将为implicitly defined by a compiler),或将其标记为= default;

class EnterMine : public State<Miner>
{
public:
    EnterMine() = default;
    ...
};

这也适用于State::State()构造函数。

答案 1 :(得分:0)

即使是单例,您仍在调用构造函数。因此,您仍然需要定义构造函数。

实际上,您需要定义在标头中声明的每个函数。