我在这里看到了几个与此问题相关的问题。但他们似乎都在讨论解决这个问题的一些 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 类,而且适用于我自己的重载 [] 运算符的类。
在我的理解中这两种形式应该是等价的v[0]
,v.operator[](0)
但是 VC++ 似乎有不同的想法。他们真的不一样吗?为什么 VC++ 调试器不能评估短形式,但对“扩展”形式没有问题?有没有办法解决?我非常习惯只复制一小段代码并在Watch Window
.