有人能解释一下为什么下面的代码段可以编译通过,但是注释掉的那一行却不行吗?
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*
,但迭代器并不是指针。 - juanchopanza