ここで、この問題に関連するいくつかの質問を見てきました。しかし、彼らは皆、この問題を解決するための STL 固有のトリックについて議論しているようです。問題の簡単な例を次に示します。std::vector オーバーロード [] 演算子など、いくつかの演算子をオーバーロードするクラスを使用するとします。
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
auto x = v[0];
オーバーロードされた演算子を呼び出す式を評価しようとするとv[0]
、この場合、VC++ は に次のエラーを表示しますWatch Window
。
v[0] no operator "[]" matches these operands
私の最初の推測では、デバッガーは引数の型を認識できないので、式を評価してから、コードを次のように変更してv[(size_type)0]
この式を評価してみました。((intvector)v)[(size_type)0]
typedef vector<int> intvector;
intvector v;
運がない。同じエラーメッセージが再び表示されました。
奇妙なことに、演算子呼び出しの拡張 (ここでの用語が正しいかどうかはわかりません) 形式を使用すると、次のように機能しますv.operator[](0)
。そして、STLクラスだけでなく、[]演算子をオーバーロードする私自身のクラスでも、普遍的に機能するようです。
私の理解では、この 2 つの形式は同等v[0]
でv.operator[](0)
あるはずですが、VC++ では考え方が異なるようです。彼らは本当に違うのですか?VC++ デバッガーが短い形式を評価できないのに、「展開された」形式では問題がないのはなぜですか? これを回避する方法はありますか?私は小さなコードをコピーしてWatch Window
.