2013-04-05 3 views
1

В настоящее время я делаю игру, в которой используется менеджер штатного стека, который отслеживает все различные состояния игры, например, главное меню.«Неизвестное преобразование» из const при передаче «this» в качестве параметра

Однако, я столкнулся с проблемой, которую я не могу решить.

Это состояние класса, урезанный только содержать вредоносный код,:

class StateManager; 

namespace first { 
namespace second { 

class State { 
    friend class StateManager; 
    protected: 
    /** 
    * Associates the state with the specified state manager instance. 
    * @param stateManager The instance to associate this state with 
    */ 
    void associateWithManager(StateManager *stateManager) { 
     mStateManager = stateManager; 
    } 
    private: 
    StateManager *mStateManager; 
}; 

} // second 
} // first 

Следующий является государственным менеджером, также урезанный:

namespace first { 
namespace second { 

class StateManager { 
    public: 
    /** 
    * Adds a state to the stack. 
    * @param state The state to add 
    */ 
    State &add(State &state) { 
     state.associateWithManager(this); 
     return state; 
    } 
}; 

} // second 
} // first 

Когда я пытаюсь скомпилировать это , Я получаю следующую ошибку (номера строк немного разряжены, так как у меня есть защитные устройства и т. Д.):

src/StateManager.cc: In member function 'State& StateManager::add(State&)': 
src/StateManager.cc:7:34: error: no matching function for call to 'State::associateWithManager(StateManager* const)' 
src/StateManager.cc:7:34: note: candidate is: 
In file included from ./include/StateManager.h:4:0, 
       from src/StateManager.cc:1: 
./include/State.h:29:10: note: void State::associateWithManager(StateManager*) 
./include/State.h:29:10: note: no known conversion for argument 1 from 'StateManager* const' to 'StateManager*' 

По-видимому, указатель this рассматривается как указатель на const, хотя я не использую ключевое слово const по методу add. Я точно не знаю, что здесь происходит. Всегда указатель thisconst? Я почти уверен, что использовал это в прошлом, но без проблем.

Также, как я это делаю, «правильный» способ? Или есть лучшее решение, когда дело доходит до информирования государства о менеджере? Возможно, используя синглтон, но я не очень большой поклонник этого.

EDIT: Теперь я понимаю, что причиной этого было объявление вперед за пределами пространств имен. Должен ли я принять ответ Майка, так как он помог мне прийти к такому выводу? Или я должен опубликовать свой собственный?

+1

Код в порядке, как указано. Вы пересылаете декларацию 'StateManager'? – ecatmur

+0

[Работает для меня] (http://ideone.com/JeS2bc). Это действительно единственная ошибка? – Angew

+0

Я удалил пространства имен, когда я разместил вопрос, но, оказывается, он действительно компилируется без них. Я сейчас обновляю вопрос, чтобы показать код с пространствами имен и т. П. @ecatmur Я действительно объявляю StateManager. – Merigrim

ответ

2

Это единственная ошибка? Когда я компилирую, я получаю эту ошибку первым:

test.cpp:8:31: error: ‘StateManager’ has not been declared 

При объявлении класса, чтобы быть другом, класс должен уже был объявлен, в противном случае объявление игнорируется. Поэтому вам нужно объявить class StateManager; в окружающем пространстве имён до определения class State. С этим изменением ваш код компилируется для меня.

+0

Ваш ответ помог мне найти актуальную проблему, см. Мое редактирование в вопросе. Большое спасибо! =) – Merigrim

+0

@Merigrim: Если у вас есть лучший ответ, тогда пошлите и отправьте его, если хотите. –

+0

Хотя я мог составить ответ, который указал на конкретную проблему и решил ее, я не думаю, что это обязательно лучше сделать. В этой ситуации, это то, что нужно делать, даже если ваш ответ был близок? – Merigrim

1

this указателя не StateManager *, это StateManager * const

попробуйте изменить константность своего аргумента StateManager* const stateManager

, если вы не хотите, чтобы modifiy вашей функции вызова, вы всегда можете бросить прочь константа: state.associateWithManager(const_cast<StateManager*>(this));

Смежные вопросы