4

ここで、この問題に関連するいくつかの質問を見てきました。しかし、彼らは皆、この問題を解決するための 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.

4

1 に答える 1