将"this"作为参数传递时从 const "No known conversion"

"No known conversion" from const when passing "this" as a parameter

本文关键字:const No conversion known 参数传递 this      更新时间:2023-10-16

我目前正在制作一款使用状态堆栈管理器的游戏,它可以跟踪所有不同的游戏状态,如主菜单。

然而,我遇到了一个我似乎无法解决的问题。

这是状态类,被简化为只包含违规代码:

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指针,即使我没有在add方法上使用const关键字。我不确定这里到底发生了什么。是this指针总是const ?我很确定我以前这样用过,但没有任何问题。

还有,我做这件事的方式是"正确"的吗?或者,当涉及到让国家知道经理的情况时,有没有更好的解决方案?也许可以使用单例,但我不太喜欢这种方式。

EDIT:我现在意识到名称空间之外的forward声明是造成这种情况的原因。既然迈克的回答帮助我得出了这个结论,我应该接受他的回答吗?或者我应该发布我自己的?

这是唯一的错误吗?当我编译它时,我首先得到这个错误:

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

当将一个类声明为友元时,该类必须已经被声明过,否则该声明将被忽略。因此,需要在定义class State之前在周围的名称空间中声明class StateManager;。修改后,您的代码为我编译。

this指针不是StateManager *,而是StateManager * const

尝试改变你的参数的常量为StateManager* const stateManager

如果你不想修改你的调用函数,你可以抛弃常量:state.associateWithManager(const_cast<StateManager*>(this));