不能将参数1从'std :: shared_ptr <chasestate>'转换为'std :: shared_ptr <state <cow>&gt;

时间:2016-12-14 23:04:33

标签: c++ inheritance casting

尝试调用方法时setCurrentState我收到错误:

  

的StateMachine&LT;牛&GT; :: setCurrentState(STD :: shared_ptr的&LT;状态&LT;牛&GT;&GT)':   无法从'std :: shared_ptr&lt; ChaseState&gt;'转换参数1至   'STD :: shared_ptr的&LT;状态&LT;牛&GT;&GT;'

这表示std::shared_ptr<ChaseState>不是std::shared_ptr<State<Cow>>,但为什么不呢?

对函数的调用:

std::shared_ptr<ChaseState> initialState = std::make_shared<ChaseState>();
m_stateMachine->setCurrentState(initialState);

State.h

#pragma once
template <class entity_type>
class State
{
public:
    virtual void enter(entity_type*) = 0;
    virtual void execute(entity_type*) = 0;
    virtual void exit(entity_type*) = 0;
};

ChaseState.h

class Cow;
class ChaseState : State<Cow>
{
public:
    ChaseState();

    // Inherited via State
    virtual void enter(Cow*) override;
    virtual void execute(Cow*) override;
    virtual void exit(Cow*) override;
};

在我的StateMachine中,我有私有变量:

std::shared_ptr<State<entity_type>> m_currentState;

和setCurrentState函数:

void setCurrentState(std::shared_ptr<State<entity_type>> s) { m_currentState = s; }

据我所知,派生类ChaseState是一个State(行为它继承自state)。

1 个答案:

答案 0 :(得分:2)

您需要声明您的继承public。默认情况下,类继承是私有的,这意味着您无法从Derived强制转换为Base,因为继承在类本身之外无法识别(与在类外部无法访问私有成员的方式相同)。 / p>

要修复,请将您的继承公开:

class ChaseState : public State<Cow>
//                 ^^^^^^