将向量迭代器传递给函数c ++

时间:2014-10-07 07:20:04

标签: c++

有人可以向我解释为什么以下段编译但后面的注释行没有?

struct tObj
{
    int data;
    int moreData;
}

...

void funcToCall (tObj *obj, int moreData)
{
    //Useful stuff here
}

void mainFunction ()
{
    vector<tObj>::iterator it = vectorOfObjects.begin(); //assumes vectorOfObjects is already defined
    while (it != vectorOfObjects.end())
    {
        funcToCall (&(*it), 0); //This line works
        funcToCall (it, 0); //This line produces an error
        it++;
    }
}

产生的错误是:

error: cannot convert ‘std::vector<tObj>::iterator {aka __gnu_cxx::__normal_iterator<tObj*, std::vector<tObj> >}’ to ‘tObj*’

关于为什么&amp;(* it)工作但只是简单it的任何想法都没有?逻辑上他们是一样的,不是吗?

因为不是*意味着取消引用和&amp;意思是通过引用传递,也就是相互抵消?

2 个答案:

答案 0 :(得分:5)

it是一个迭代器对象,按原样传递它意味着你试图为期望vector<tObj>::iterator的函数传递tObj*类型的对象,从而错误。

当您执行*it时,您将获得迭代器所代表的基础对象,当您在其上应用&时,您将获得对象的地址,该地址是类型tObj*,它与函数的参数类型一致,因此没有错误。

答案 1 :(得分:2)

编译代码时必须声明一个像

这样的重载函数
void funcToCall ( std::vector<tObj>::iterator it, int moreData)
{
    //Useful stuff here
}

一般情况下,类型tObj *vector<tObj>::iterator是不同的类型,但在std :: vector的一些旧实现中,它的迭代器确实被定义为指针..