有人可以向我解释为什么以下段编译但后面的注释行没有?
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;意思是通过引用传递,也就是相互抵消?
答案 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的一些旧实现中,它的迭代器确实被定义为指针..