[英]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.