0

私のコードでは、[]演算子(自分のバージョンのSTLマップを作成するための演習)をオーバーレイする2つのテンプレート関数を作成しました。

const V& operator[](const K& key) const;    // X = map["kuku"]

V& operator[](const K& key);                // map["kuku"] = x

次に、次の関数を使用して演算子を使用します。

invokeStkCmd (my_stacks[stk_name], my_cmds[crnt_word]);

そのテンプレートは

invokeStkCmd (StackComp* stkPtr, const shake_cmds_t cmd)

この呼び出しでは、V& operator[](const K& key)テンプレート(少なくとも2番目のパラメーター)を使用します。これにより、マップにエントリを追加できますが、意図した他のテンプレートは追加できません。ここStackOverflowの最近の演算子オーバーロードの投稿を参照すると、私の演算子オーバーロードテンプレート関数は問題ないようです。invokeStkCmd関数で何かを行う必要がありますか、それとも演算子のオーバーロード関数は結局正確ではありませんか?

4

1 に答える 1

0

これは、変更時に動作が大きく異なるオブジェクトを扱う場合によくある問題です。これは、戻り値の型や戻り値の使用ではなく、引数の型のみに基づいてオーバーロードが解決されるという単純な事実が原因です。したがって、最も簡単な解決策は、インデックス作成が行われる直前にa を使用const_castしてマップ オブジェクトを作成することです。const

invokeStkCmd (my_stacks[stk_name], const_cast<my_map<Whatever> const&>(my_cmds)[crnt_word]);

これは冗長でエラーが発生しやすいため、満足できない場合があります。この場合、通常の関数とは異なり、キャスト演算子のオーバーロードが戻り値の型に基づいて解決されるという事実を利用する高度な方法もあります。私はこのような答えをここに投稿しました。それを正しく行うのはかなり難しいことに注意してください。

于 2012-06-24T19:12:47.067 に答える