没有操作员发现它采用类型“类型”的左边的操作数 - 从VC6迁移C ++代码VS2008后错误C2678

StackOverflow https://stackoverflow.com/questions/968602

这一段代码编译文件中VC6但在2008年它VS提供了一个错误。谁能告诉我为什么? 我想这是因为你再也不能比拟的指针为NULL(这是0的类型定义)。 如果是这样的话,我怎么做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>'   (或者没有可接受的转化率)

有帮助吗?

解决方案

的类型为“的std ::矢量:迭代”不一定是指针类型,所以你不能把它比为NULL。

在你的旧的编译器它正好是一个指针,因此您的代码编译。但你只是很幸运(如图所示当你移动代码到一个不同的编译器)。

在迭代器中的唯一的测试必须是比较它结束()或开始()或该范围内任何有效迭代开始() - >端()。由于这是一个向量,你可以做数学运算与迭代器。 IT-开始()应该给你一个偏移量。但是,这不适用于所有容器(检查每个容器文档)。

所有你需要做的是考什么的迭代点:

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
    }
}

其他提示

在迭代器不是指针,它是一个类的实例,并没有二元运算符!=将它与空比较。

您正试图给迭代比较空的第一个条件if语句。你不需要这个第一次比较的迭代器它应该alays是列表的有效部内。

一个迭代器相较于NULL是从来没有的法律。 VC6让你做,但错了这样做的。

在你给的例子,比较是没有意义的,因为迭代器都将始终指向的东西。检查(* IT)!= NULL是合理的,仍然有效。

如果有一个真正的前景,迭代器不指向一个有效的对象,VC9具有一个未记录的功能

IT._Has_container()

如果迭代不那将是如果一个迭代点到容器真假。要设置迭代器呢,你分配一个空迭代:

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

以上表示不可移植的代码和风格比较差,我不建议任何设计来使用它。不过,如果你需要快速得到一些VC6代码编译VC9上,它可能让你摆脱困境。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top