//声明了一个
vector<classA*> vecA;
//进行了一些操作,如 vecA.push(new classA());
//这里出错了:vector<classA*>::iterator it = &vecA[0];
//但是在VC6.0里一切正常出错信息:错误 1 error C2440: “初始化”: 无法从“classA**”转换为“std::_Vector_iterator<_Ty,_Alloc>” e:\testca\lane.cpp 99

解决方案 »

  1.   

    因为你的vecA本身里面存储的是一个指针弄的对象,而迭代器vector <classA*>::iterator 本身也是一个指针变量,所以没有必要再取地址。
      

  2.   


    如果要用第N个元素,可以:it = vecA.begin() + N;另外:迭代器很不安全,建议在用迭代器时,用一个同步变量保护一下。
      

  3.   

    vector <classA*>::iterator it = &vecA[0]; 
    ------------------------------------------
    你的发明很有新意!用迭代器就老老实实从 begin end 开始。
      

  4.   

    &vecA[0]或者vecA并没有错.因为这2个的结果都是地址.只是2005的类型检查更严格.迭代器虽然是指针变量.但跟上面的指针并不是一个类型.(虽然可以访问同样的数据)
      

  5.   

    是2005的类型检查的问题,它更严格。
    vector的内存结构和数组是兼容的,迭代器的内存结构也和数组元素是兼容的,当然,换其它STL可能会不兼容。关于2005的类型检查的问题,我举个例子,在6.0下,
    vector <classA*> vecA; 
    在需要ClassA*参数的参数中,传一个vecA的迭代器,是可以通过编译的,而在2005下,可能不行,于是处理一下:
    vector <classA*>::iterator it = vecA.begin();
    fun(&*it);其实从字面上看,&*两个符号在一起,是等于同时去掉两个符号的,但结果是一个可以编译,一个不行。
      

  6.   

    vector <classA*>::iterator 不可以赋值,
    只能指向内部数据
      

  7.   

    迭代器不是指针,所以vs2005下编译不过去正常
    你只能先解引用,然后再取地址
    &*vec.begin();
    类似这样的写法得到指针.
      

  8.   

    to WG_Wolf
    你怎么知道不能赋值,你这样试试:
    vector  <classA*>::iterator it = 0;我觉得楼主写出这样的程序:vector <classA*>::iterator it = &vecA[0]; 
    先不管能过编译与否,说明人家对迭代器的理解还是比较深入的,再比如数组,取一个数组的某个值的写法是:
    int i = a[10];可是你见过这样的写法吗:
    int i = 10[a];只有对数组以及编译器对数组的处理理解了,才能写出后面的代码(它是正确的),你不能讽刺人家说“发明有新意”!
      

  9.   

    vector <classA*>::iterator it = &vecA[0]; 
    这个写法不能说错误,但也不能说正确.虽然在某些编译器上能编译通过,但编译不过去的编译器也不少.
      

  10.   

    to akirya
    vector的迭代器应该是和指针是兼容的,当然这也得看STL库。
    但其它的,如list的迭代器就和指针肯定不兼容了。
    我也不推荐将指针赋给vector的迭代器。
    至于编译不过去,还是哪句话,编译器作者让你过不去就过不去,编译不过去与他们本质上兼容与否或者完全相同与否,都没有必然的联系!
      

  11.   

    to yang79tao,akirya:
    感谢二位的耐心回答,你们丰富的经验帮我解决了棘手的问题,并帮我对STL有了更进一步的认识
      

  12.   

    在VC6下赋值没问题,但在VC8下是不行的.
    没有规定迭代器可以赋值给指针.只是说迭代器的行为跟指针相似.
      

  13.   

    这个编译不过去取决于STL的实现.
      

  14.   

    谨慎使用STL
    Iterator是一个类