没有操作员发现它采用类型“类型”的左边的操作数 - 从VC6迁移C ++代码VS2008后错误C2678
-
13-09-2019 - |
题
这一段代码编译文件中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上,它可能让你摆脱困境。