错误:从long int转换为非标量类型__gnu_cxx :: __ normal_iterator

时间:2012-06-22 10:14:32

标签: c++ gcc cmake

我正在尝试在Linux(Redhat)中运行旧的C ++代码。我使用的是gcc 4.1.2版。 这是我得到错误的代码示例:

           template <class TP> TP *GCVVector<TP>::Find(const TP &Obj)
        {
        #ifdef WIN32
                using namespace std;
                typedef typename vector<TP>::iterator Viterator;
        #else
        #ifdef __HP_aCC 
                using namespace std;
                typedef typename vector<TP>::iterator Viterator;
        #else
                using namespace std;
                typedef typename std::vector<TP>::iterator Viterator;
        #endif
        #endif

                Viterator pCurrent =NULL ;

我得到的错误是:

         /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVVector.h: In member          function âTP* GCVVector<TP>::Find(const TP&) [with TP = GCVAsso<GCVString, GCVString>::KeyNode]â:
        /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVAsso.h:165:   instantiated from âbool GCVAsso<KTP, VTP>::Add(KTP, VTP) [with KTP = GCVString, VTP = GCVString]â
        /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVTransformationServices.h:69:   instantiated from here
         /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVVector.h:398: error: conversion from âlong intâ to non-scalar type â__gnu_cxx::__normal_iterator<GCVAsso<GCVString, GCVString>::KeyNode*, std::vector<GCVAsso<GCVString, GCVString>::KeyNode, std::allocator<GCVAsso<GCVString, GCVString>::KeyNode> > >â requested
           /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVAsso.h:165:   instantiated from âbool GCVAsso<KTP, VTP>::Add(KTP, VTP) [with KTP = GCVString, VTP = GCVString]â
        /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVTransformationServices.h:69:   instantiated from here
        /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVVector.h:403: error: no match for âoperator=â in âpCurrent = GCVVector<TP>::BinarySearch [with TP = GCVAsso<GCVString, GCVString>::KeyNode](0l, (GCVVector<TP>::GetSize [with TP = GCVAsso<GCVString, GCVString>::KeyNode]() - 1l), ((const GCVAsso<GCVString, GCVString>::KeyNode&)((const GCVAsso<GCVString, GCVString>::KeyNode*)Obj)))â
        /usr/lib/gcc/x86_64-redhat-   linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator.h:634: note: candidates are: __gnu_cxx::__normal_iterator<GCVAsso<GCVString, GCVString>::KeyNode*, std::vector<GCVAsso<GCVString, GCVString>::KeyNode, std::allocator<GCVAsso<GCVString, GCVString>::KeyNode> > >& __gnu_cxx::__normal_iterator<GCVAsso<GCVString,         GCVString>::KeyNode*, std::vector<GCVAsso<GCVString, GCVString>::KeyNode, std::allocator<GCVAsso<GCVString, GCVString>::KeyNode> > >::operator=(const __gnu_cxx::__normal_iterator<GCVAsso<GCVString, GCVString>::KeyNode*, std::vector<GCVAsso<GCVString, GCVString>::KeyNode, std::allocator<GCVAsso<GCVString, GCVString>::KeyNode> > >&)
        make[2]: ***    [CMakeFiles/GCVCore.dir/trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVTransformationServices.o] Error 1
        make[1]: *** [CMakeFiles/GCVCore.dir/all] Error 2

2 个答案:

答案 0 :(得分:3)

原始代码是针对STL编写的,其中std::vector<T>::iterator是一个原始指针,因此可能(并且需要)初始化为NULL。

要获得完全兼容性,请将行更改为

Viterator pCurrent = Viterator();

在C ++ 11中,您可以使用

Viterator pCurrent{};

完全兼容性在这里意味着Viterator可能只是一个裸指针。在这种情况下,将其明确设置为默认构造值将将其设置为NULL。下面是一个演示它的简单示例。

#include <iostream>

typedef void * Iterator;

int main(int, char**)
{
  Iterator v1, v2=Iterator();
  std::cout << "uninitialized pointer: " << v1 << "\ninitialized pointer: " << v2 << std::endl;
}

输出结果为:

uninitialized pointer: 0x7fff5fc01052
initialized pointer: 0

请注意,如果程序对pCurrent执行任何操作,但程序可能仍然不正确,除了为其分配新值(将其与自身进行比较或通过复制初始化的其他迭代器有效,但是比较对于非奇异迭代器,或者单独的默认值构造的迭代器将是未定义的。)

答案 1 :(得分:0)

迭代器不是数字,它是一个对象,大多数时候不会将数字作为构造函数参数。

只需用

替换该行
Viterator pCurrent = Viterator();

它将以与当前代码相同的方式失败。