无法在Watch窗口中使用重载运算符计算表达式

时间:2013-10-18 22:01:33

标签: c++ visual-c++ visual-studio-2012 visual-studio-debugging

我在这里看到了几个与此问题相关的问题。但他们似乎都在讨论一些解决这个问题的STL特定技巧。 这是一个简单的问题示例。假设我们使用一个类,它重载了一些运算符,比如std :: vector overloading [] operator:

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中进行评估。

1 个答案:

答案 0 :(得分:0)

如果有const和非const版本可用,Visual Studio的调试器表达式不支持重载运算符。请参阅此page on MSDN

  

调试器不支持具有const和非const版本的重载运算符。具有const和非const版本的重载运算符经常在标准模板库中使用。