2016-12-14 3 views
2

При попытке вызвать метод setCurrentState Im получаю ошибку:не может преобразовать аргумент 1 из «станд :: shared_ptr <ChaseState>» до «станд :: shared_ptr <State<Cow>>

StateMachine<Cow>::setCurrentState(std::shared_ptr<State<Cow>>)': cannot convert argument 1 from 'std::shared_ptr<ChaseState>' to 'std::shared_ptr<State<Cow>>'

Это указывает на то, что 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 является государством (behause он наследует от государства).

ответ

2

Вам необходимо декларировать свое наследование public. Наследование класса является закрытым по умолчанию, что означает, что вы не можете отбрасывать от Derived до Base, потому что наследование не распознается вне самого класса (так же, как доступ к закрытым элементам вне класса).

Чтобы исправить, сделать ваше наследство общественности:

class ChaseState : public State<Cow> 
//     ^^^^^^ 
Смежные вопросы