2

这段代码在 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
}
}

错误 C2678:二进制“!=”:未找到采用“std::_Vector_iterator<_Ty,_Alloc>”类型的左侧操作数的运算符(或没有可接受的转换)

4

4 回答 4

8

'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
    }
}
于 2009-06-09T07:33:32.930 回答
2

迭代器不是指针,它是一个类实例,并且没有二元运算符 != 将其与 null 进行比较。

于 2009-06-09T07:35:34.190 回答
1

您试图在 if 语句的第一个条件中将迭代器与 NULL 进行比较。您不需要第一次比较,因为迭代器 iT 应该在列表的有效部分内。

于 2009-06-09T07:16:11.233 回答
0

将迭代器与 NULL 进行比较是不合法的。VC6 让你这样做,但这样做是错误的。

在您给出的示例中,比较是没有意义的,因为迭代器总是指向某些东西。检查 (*IT)!=NULL 是合理的并且仍然有效。

如果确实存在迭代器不指向有效对象的可能性,VC9 有一个未记录的函数

IT._Has_container()

如果迭代器指向容器,则为 true;如果迭代器不指向容器,则为 false。要将迭代器设置为空,请分配一个空迭代器:

IT = std::vector<aCattrBase*>::iterator();

以上代表不可移植的代码和相当糟糕的风格,我不建议设计任何东西来使用它。但是,如果您需要快速获取一些 VC6 代码以在 VC9 上编译,它可能会让您摆脱麻烦。

于 2009-06-09T09:45:27.640 回答