2013-01-24 42 views
3

我有以下的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*&’ 

這種轉換如何幾乎是不可能的?編譯器在什麼情況下發布這樣的錯誤?

至於什麼我實際上做:

  • 我有一個類子菜單
  • 我有一個類的菜單,從子菜單繼承
  • 菜單有Stack<Submenu*>類型的附加字段將映射記住打開子菜單
  • 菜單的所有方法(如「打開菜單」,「點擊菜單項」等)都是指當前位於堆棧頂部()的子菜單。在子類Submenu中,它們在對象本身上進行操作。
  • 菜單有一個公開的方法來關閉當前的子菜單並向上 - 即彈出堆棧中的子菜單。
  • 菜單可以彈出,直到它到達本身,請參閱下面的含義。

現在是最有可能的問題,即,菜單的構造函數的一部分:

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

它這樣做,因爲當所有的菜單得到封閉,相對的方法來stack.top()應請參考菜單本身,也是一種子菜單(因爲它繼承了它)。

編輯:

我做的,而不是使用的std ::堆棧(如我最初建議),並在答案中指出我自己的類堆棧,有說謊的問題。請原諒我的不準確。

回答

5

通常,您只能將左值轉換爲引用,而不是右值(鑄造值是右值)。您可以將右值轉換爲const引用,這可能是您真正想要的 - 如果您將Stack::push更改爲const T &而不是T &,則錯誤將消失。

0

A Submenu*&可以被分配任何Submenu*。這樣做對(Submenu*)this有幫助嗎?編號

所以C++會阻止你。

現在,爲什麼你的stack::push需要參考?不知道。