【发布时间】:2014-10-07 07:20:03
【问题描述】:
谁能向我解释为什么下面的代码段可以编译但后面的注释行没有?
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 无效的任何想法?逻辑上它们是一样的,不是吗?
因为* 不意味着取消引用,& 意味着通过引用传递也就是相互抵消?
【问题讨论】:
-
该函数需要一个指向
tObj的指针,你传递一个迭代器。迭代器不是指针(尽管某些实现可能将vector<T>::iterator实现为T*。)