[英]Passing vector iterator to a function 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*’
关于为什么&(*it)
有效但很明显it
没有的任何想法? 从逻辑上讲,它们是相同的,不是吗?
因为*
不是意味着取消引用,而&
不是意味着通过引用传递,也就是相互抵消吗?
it
是一个迭代器对象,按原样传递它意味着您正在尝试为期望tObj*
的函数传递一个类型为vector<tObj>::iterator
的对象,从而导致错误。
当你这样做时*it
你会得到迭代器所代表的底层对象,当你在它上面应用&
时,你会得到那个对象的地址,它是tObj*
类型,它与函数的参数类型一致,因此没有错误。
要编译代码,您必须声明一个重载函数,例如
void funcToCall ( std::vector<tObj>::iterator it, int moreData)
{
//Useful stuff here
}
在一般情况下,类型tObj *
和vector<tObj>::iterator
是不同的类型,尽管在 std::vector 的一些旧实现中,它的迭代器确实被定义为指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.