Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迁移C+后出现错误C2678+;从VC6到VS2008的代码-未找到接受类型为';类型';_C++_Visual Studio_Visual Studio 2008_Visual C++ 6 - Fatal编程技术网

C++ 迁移C+后出现错误C2678+;从VC6到VS2008的代码-未找到接受类型为';类型';

C++ 迁移C+后出现错误C2678+;从VC6到VS2008的代码-未找到接受类型为';类型';,c++,visual-studio,visual-studio-2008,visual-c++-6,C++,Visual Studio,Visual Studio 2008,Visual C++ 6,这段代码在VC6中编译文件,但在VS2008中它给出了一个错误。谁能告诉我为什么? 我猜这是因为您无法再将指针与NULL(0的typedef)进行比较。 如果是这样,我如何在VC9中进行比较 for ( std::vector<aCattrBase*>::iterator iT = attrLst.begin(); iT < attrLst.end(); iT++) { if ( (iT != NULL) && (*iT

这段代码在VC6中编译文件,但在VS2008中它给出了一个错误。谁能告诉我为什么? 我猜这是因为您无法再将指针与NULL(0的typedef)进行比较。 如果是这样,我如何在VC9中进行比较

for ( std::vector<aCattrBase*>::iterator iT = attrLst.begin(); iT < attrLst.end(); iT++)
        { 
            if ( (iT != NULL) && (*iT != NULL) ) //Error: C2678
            {
//code
}
}
for(std::vector::iterator iT=attrLst.begin();iT
错误C2678:二进制“!=”:无操作员 找到接受左手操作数的 类型 'std::_Vector_iterator' (或没有可接受的转换)


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

std::vector::iterator'的类型不一定是指针类型,因此无法将其与NULL进行比较

在旧编译器中,它恰好是一个指针,因此编译了代码。但是你很幸运(当你将代码移到另一个编译器时,如图所示)

对迭代器的唯一测试是将其与end()或begin()或范围begin()->end()内的任何有效迭代器进行比较。因为这是一个向量,所以可以用迭代器进行数学运算。它-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
    }
}
for(std::vector::iterator iT=attrLst.begin();
iT!=attrLst.end();//更改了此值。请注意=
++它)//改变了这个。对于非整数类型,首选预增量
{ 
如果(*iT!=NULL)
{
//代码
}
}

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

将迭代器与null进行比较从来都不合法。VC6允许您这样做,但这样做是错误的

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

如果迭代器没有指向有效对象,那么VC9有一个未记录的函数

IT._Has_container()
如果迭代器指向容器,则为true;如果迭代器未指向容器,则为false。要将迭代器设置为nothing,请指定一个空迭代器:

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

上面的代码是不可移植的,样式也很差,我不建议设计任何东西来使用它。但是,如果您需要在VC9上快速编译一些VC6代码,它可能会帮您摆脱麻烦。

同意。但是,这种比较有什么错?这种比较的替代方案是什么?这取决于这种比较试图达到什么目的。最接近的等价物是一个默认构造的迭代器(如果迭代器是指针,那么它将为NULL)。