2014-10-07 79 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重載函數是不同的類型,雖然在標準::向量的一些老的實現它的迭代器確實定義作爲指針。