您遇到的错误是由于调试器中的限制,并不像Daniel暗示的那样存在bug。 监 windows 口无法调用重载运算符。例如,如果您有std::vector<int> vecSomething,则无法将vecSomething[0]放入监 windows 口,因为std::vector<int>::operator[]是重载运算符。因此,对于对象向量,您无法在监 windows 口中执行vecObject[0].SomeMemberVariableOfObject。您可以编写vecObject._Myfirst[0].SomeMemberVariableOfObject。在Visual Studio的STL实现中,_Myfirst是指向第一个元素的向量的成员。 如果要将自己的变量和类型添加到监 windows 口中,请直接将监视添加到数据成员中。跟踪像member.memberStruct.ptrToObj->memberOfObj这样的指针链没有问题。 编辑: 实际上,Visual Studio可以调用"监视"窗口中的代码:http://geekswithblogs.net/sdorman/archive/2009/02/14/visual-studio-2008-debugging-ndash-the-watch-window.aspx 因此,为什么不能使用重载运算符有点神秘。
6条答案
按热度按时间d7v8vwbk1#
您遇到的错误是由于调试器中的限制,并不像Daniel暗示的那样存在bug。
监 windows 口无法调用重载运算符。例如,如果您有
std::vector<int> vecSomething
,则无法将vecSomething[0]
放入监 windows 口,因为std::vector<int>::operator[]
是重载运算符。因此,对于对象向量,您无法在监 windows 口中执行vecObject[0].SomeMemberVariableOfObject
。您可以编写vecObject._Myfirst[0].SomeMemberVariableOfObject
。在Visual Studio的STL实现中,_Myfirst
是指向第一个元素的向量的成员。如果要将自己的变量和类型添加到监 windows 口中,请直接将监视添加到数据成员中。跟踪像
member.memberStruct.ptrToObj->memberOfObj
这样的指针链没有问题。编辑:
实际上,Visual Studio可以调用"监视"窗口中的代码:http://geekswithblogs.net/sdorman/archive/2009/02/14/visual-studio-2008-debugging-ndash-the-watch-window.aspx
因此,为什么不能使用重载运算符有点神秘。
jhdbpxl92#
为什么会这样呢?
这个工具有它的局限性。例如,很多时候我"转到定义",却找不到定义。我不得不"在文件中查找"。在调试会话期间,一些表达式也没有计算,这并不奇怪。
你要怎么修?
sc4hvdpw3#
此Microsoft Documentation中详细描述了该问题和可能的解决方法
调试器接受大多数Microsoft和ANSI C/C表达式;但是,您需要注意以下几点:
不支持的运算符和附加运算符
对本机C表达式的限制
amrnrhlw4#
我找到了一个解决方案,它(在某种程度上)解决了重载运算符的问题,它似乎不依赖于类的内部结构,你必须使用运算符调用的扩展形式,下面是
vector<int> v
的一个例子:我在Visual C++ 2012中测试了它。
yx2lnoni5#
PDB文件管理远非完美,尤其是在大型项目中。特别是,VS有一个相当愚蠢的行为,即合并VSxx.PDB中的所有符号,甚至跨不同的项目。/Fd开关可以很容易地解决这个问题;传递
$(TargetDir)$(TargetName).pdb
或类似的函数。cfh9epnr6#
这可能是由于嵌套类
示例:
类似于(B *)(0x12345678)的强制转换将失败,但(A::B *)(0x12345678)将成功