2016-12-14 11 views
2

エラーを取得する方法setCurrentStateイムを呼び出そうとすると:から、引数1を変換することはできません「のstd :: shared_ptrの<ChaseState>」STD」に:: 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; 
}; 

を私はプライベート変数を持っている:

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

とsetCurrentState機能:

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

Iは、派生クラスChaseState状態であることを理解ように(それが状態から継承behause)。

答えて

2

あなたは継承を宣言する必要がありますpublic。クラスの継承はデフォルトではプライベートなので、継承はクラス自体の外部では認識されないため(クラス外でのプライベートメンバーのアクセス方法と同じです)、DerivedからBaseにキャストできません。あなたの継承が公開する、固定するために

class ChaseState : public State<Cow> 
//     ^^^^^^ 
関連する問題