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*&’

どうしてそのような変換は不可能なのだろうか?コンパイラはどのような場合にそのようなエラーを発行しますか?

私が実際にやっていたことに関して:

  • クラスサブメニューがあります
  • サブメニューから継承するクラスメニューがあります
  • Stack<Submenu*>メニューには、開いているサブメニューを記憶してマップするタイプの追加フィールドがあります
  • 「メニューを開く」、「メニュー項目をクリックする」などのメニューのすべてのメソッドは、現在スタックのtop()にあるサブメニューを参照します。クラスサブメニュー内では、オブジェクト自体を操作します。
  • Menuには、現在のサブメニューを閉じて上に移動するパブリックメソッドがあります。つまり、スタックからサブメニューをポップします。
  • メニューはそれ自体に到達するまでポップする可能性があります。以下の意味を参照してください。

これがおそらく問題となる部分、つまりMenuのコンストラクターです。

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

これは、すべてのメニューが閉じられると、stack.top()に関連するメソッドがメニュー自体を参照する必要があるためです。これも一種のサブメニューです(メニューから継承するため)。

編集:

std :: stackを使用する代わりに(最初に提案したように)独自のクラスStackを作成しましたが、回答で指摘されているように、問題がありました。その不正確さについてすみません。

4

2 に答える 2

5

通常、左辺値は参照にのみ変換でき、右辺値は変換できません(キャストは右辺値です)。右辺値を参照に変換できconstます。これはおそらくここで本当に必要なことです。変更して、の代わりに引数Stack::pushを取ると、エラーはなくなります。const T &T &

于 2013-01-24T01:46:09.210 に答える
0

ASubmenu*&には任意のを割り当てることができますSubmenu*。それをするのは理にかなってい(Submenu*)thisますか?いいえ。

したがって、C++はあなたを止めます。

さて、なぜあなたstack::pushは参照を取るのですか?ダンノ。

于 2013-01-24T01:50:23.677 に答える