2014-10-07 78 views
1

任何人都可以向我解释为什么下面的段编译,但后面的注释行不?将矢量迭代器传递给函数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不?从逻辑上讲,它们是一样的,不是吗?

因为不意味着解除引用而且&意味着通过引用又意味着彼此抵消掉?

+2

函数需要一个指向'tObj'的指针,你传递一个迭代器。一个迭代器不是一个指针(尽管一些实现*可能*将'vector :: iterator'实现为'T *'。) – juanchopanza 2014-10-07 07:22:35

回答

4

it是一个迭代器对象,按原样传递它意味着您正在尝试传递类型为vector<tObj>::iterator的对象,该函数的作用是期望tObj*,从而出现错误。

当你做*it你会得到迭代器表示基础对象,当你申请&之上,你得到对象的地址,这是tObj*类型与函数的参数类型,因此同意不错误。

+0

啊,谢谢你的提示。我猜矢量迭代器只是让我感到困惑。 – Tim 2014-10-07 09:05:00

+2

也许,但只是想到迭代器就是这样 - 不是指针,而是其他任何东西。他们只是允许你以某种方式迭代一个集合。这些迭代器提供了一个'operator *'来访问底层元素,而且它与指针无关;它只是语法糖。 – legends2k 2014-10-07 10:25:52

+0

这样做更有意义。非常感谢这些信息。从来没有想过,他们可能已经超载'operator *'。 – Tim 2014-10-07 12:34:00

2

,该代码会被编译必须声明像

void funcToCall (std::vector<tObj>::iterator it, int moreData) 
{ 
    //Useful stuff here 
} 

在一般情况下,类型和vector<tObj>::iterator重载函数是不同的类型,虽然在标准::向量的一些老的实现它的迭代器确实定义作为指针。