4

我有以下 g++ 错误

Menu.hpp:66:41: error: no matching function for call to ‘Menu::Stack<Submenu*>::push(Submenu*)’
Menu.hpp:66:41: note: candidate is:
Menu.hpp:14:21: note: void Menu::Stack<T>::push(T&) [with T = Submenu*]
Menu.hpp:14:21: note:   no known conversion for argument 1 from ‘Submenu*’ to ‘Submenu*&’

这样的转变怎么可能是不可能的呢?编译器在什么情况下会发出这样的错误?

至于我实际上在做什么:

  • 我有一堂课
  • 我有一个继承自 Submenu 的类 Menu
  • 菜单有额外的类型字段Stack<Submenu*>映射记住打开的子菜单
  • Menu 的所有方法,如“打开菜单”、“单击菜单项”等,都是指当前位于堆栈顶部() 的子菜单。在 Submenu 类中,它们对对象本身进行操作。
  • Menu 有一个关闭当前子菜单并向上的公共方法——即从堆栈中弹出子菜单。
  • 菜单可以弹出,直到它到达自身,见下文是什么意思。

现在是最有可能出现问题的部分,即 Menu 的构造函数:

Menu() { stack.push( (Submenu*)this ); }

这样做是因为当所有菜单都关闭时,与 stack.top() 相关的方法应该引用菜单本身,它也是一种子菜单(因为它继承自它)。

编辑:

我已经制作了自己的类 Stack 而不是使用 std::stack (正如我最初建议的那样),并且正如答案中所指出的那样,问题存在。请原谅我的不准确之处。

4

2 回答 2

5

Generally, you can only convert lvalues to references, not rvalues (a cast is an rvalue). You can convert rvalues to const references, which is probably what you really want here -- if you change Stack::push to take a const T & argument instead of a T &, the errors will go away.

于 2013-01-24T01:46:09.210 回答
0

ASubmenu*&可以分配任何Submenu*. 这样做有意义(Submenu*)this吗?不。

所以 C++ 阻止了你。

现在,您为什么stack::push要参考?不知道。

于 2013-01-24T01:50:23.677 回答