bob*_*lex 2 c++ visual-c++-6 visual-studio-2008 visual-studio
这段代码在VC6中编译文件,但在VS 2008中它会出错.谁能告诉我为什么?我想这是因为你不能再将指针与NULL(这是一个0的typedef)进行比较.如果是这种情况,我该如何在VC9中进行这种比较?
for ( std::vector<aCattrBase*>::iterator iT = attrLst.begin(); iT < attrLst.end(); iT++)
{
if ( (iT != NULL) && (*iT != NULL) ) //Error: C2678
{
//code
}
}
Run Code Online (Sandbox Code Playgroud)
错误C2678:二进制'!=':找不到运算符,它接受类型为'std :: _ Vector_iterator <_Ty,_Alloc>'的左手操作数(或者没有可接受的转换)
'std :: vector :: iterator'的类型不一定是指针类型,因此您无法将其与NULL进行比较.
在您的旧编译器中,它恰好是一个指针,因此您的代码已编译.但是你很幸运(如你将代码移动到另一个编译器时所示).
对迭代器的唯一测试是将它与end()或begin()或begin() - > end()范围内的任何有效迭代器进行比较.由于这是一个向量,您可以使用迭代器进行数学运算.iT-begin()应该给你一个偏移量.但这对所有容器都无效(请检查每个容器文档).
您需要做的就是测试迭代器指向的内容:
for ( std::vector<aCattrBase*>::iterator iT = attrLst.begin();
iT != attrLst.end(); // Changed this. Notice the !=
++iT) // Changed this. Prefer pre increment for not integer types
{
if ( *iT != NULL)
{
//code
}
}
Run Code Online (Sandbox Code Playgroud)