В настоящее время я делаю игру, в которой используется менеджер штатного стека, который отслеживает все различные состояния игры, например, главное меню.«Неизвестное преобразование» из 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
. Я точно не знаю, что здесь происходит. Всегда указатель this
const
? Я почти уверен, что использовал это в прошлом, но без проблем.
Также, как я это делаю, «правильный» способ? Или есть лучшее решение, когда дело доходит до информирования государства о менеджере? Возможно, используя синглтон, но я не очень большой поклонник этого.
EDIT: Теперь я понимаю, что причиной этого было объявление вперед за пределами пространств имен. Должен ли я принять ответ Майка, так как он помог мне прийти к такому выводу? Или я должен опубликовать свой собственный?
Код в порядке, как указано. Вы пересылаете декларацию 'StateManager'? – ecatmur
[Работает для меня] (http://ideone.com/JeS2bc). Это действительно единственная ошибка? – Angew
Я удалил пространства имен, когда я разместил вопрос, но, оказывается, он действительно компилируется без них. Я сейчас обновляю вопрос, чтобы показать код с пространствами имен и т. П. @ecatmur Я действительно объявляю StateManager. – Merigrim