[英]Problem C++ STD Iterator comparison operators
早上好先生
因為看起來我的情況不會那么好。
我有一個C類,它沒有任何子代,但有一個由指向另一個類的實例的指針組成的向量,我們稱它為B:
class C
{
public:
...
std::vector<B*> elements;
...
}
B還有一個指向另一個類的實例的指針向量,我們稱它為A:
class B
{
public:
...
std::vector<A*> elements2;
...
}
C有一個遍歷element和elements2的元素的方法,其工作方式如下:
std::vector<B*>::iterator it1;
std::vector<A*>::iterator it2;
for (it1=this->elements.begin(); it1!=this->elements.end(); ++it1)
{
for (it2 = it1->elements2.begin(); it12=it1->elements2.end(); ++it2)
{
it2->do_something(); //method of class A
}
}
但是編譯器(g ++)一直告訴我在(類層次結構)中沒有運算符!=的匹配項。
有人知道我做錯了嗎? 其他運算符(例如'<')似乎也不起作用。
我不是新手,但這是我第一次在C ++(以前的Python程序員)中使用迭代器,而且我無法真正弄清楚代碼的問題所在。
感謝您的事先幫助,我為此感到迷茫!
編輯:我正在添加整個錯誤以供參考。 我對其進行了編輯以適合該問題,希望我不要弄亂任何東西:
在'it1!'中沒有'operator!='的匹配!=(((C *)this)-> C :: elements.std :: vector <_Tp,_Alloc> :: end _Tp = B *,_Alloc = std ::分配器”
您應該嘗試這樣:
std::vector<B*>::iterator it1;
std::vector<A*>::iterator it2;
for (it1=this->elements.begin(); it1 != this->elements.end(); ++it1)
{
for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2)
{
(*it2)->do_something(); //method of class A
}
}
it1
(類型為std::vector<B*>::iterator
)與它it1->elements2.end()
(類型為std::vector<A*>::iterator
it1->elements2.end()
std::vector<A*>::iterator
)進行比較,所以編譯器是正確的抱怨。 it2
以“到達”類型為A*
的元素: (*it2)->do_something()
附帶說明一下,可能有幾種方法可以改善您現有的代碼,但我僅列舉幾種:
this->
typedef
澄清涉及迭代器的代碼 it1
和it2
,請縮小范圍 您可以編寫(顯然,向量typedef
的名稱應該更有意義):
typedef std::vector<A*> vector_of_A;
typedef std::vector<B*> vector_of_B;
for (vector_of_B::iterator it1 = elements.begin(), end1 = elements.end(); it1 != end1; ++it1)
{
vector_of_A &innerVector = (*it1)->elements2;
for (vector_of_A::iterator it2 = innerVector.begin(), end2 = innerVector.end(); it2 != end2; ++it2)
{
/* ... */
}
}
這應該編譯為:
std::vector<B*>::iterator it1;
std::vector<A*>::iterator it2;
for (it1 = elements.begin(); it1 != elements.end(); ++it1)
{
for (it2 = elements2.begin(); it2 != elements2.end(); ++it2)
{
it2->do_something(); //method of class A
}
}
但是我不知道你想做什么。
您有一個指向指針的向量。 因此,要在該指針上調用函數,必須先解除對迭代器的引用(以獲取指針),然后再對其進行調用。
for ( it1 = elements.begin(); it1 != elements.end(); ++it1)
{
for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2)
{
(*it2)->do_something(); //method of class A
}
}
編輯 :我認為問題出在其他地方。 以下代碼在VS2008和VS2010上可以正常編譯
class A
{
public:
void Fn()
{
}
};
class B
{
public:
std::vector<A*> elements2;
};
class C
{
public:
std::vector<B*> elements;
void Fn()
{
std::vector< B* >::iterator it1;
std::vector< A* >::iterator it2;
for ( it1 = elements.begin(); it1 != elements.end(); ++it1 )
{
for ( it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2 )
{
(*it2)->Fn();
}
}
}
};
以下代碼適用於Linux上的gcc 4.2.0。 您使用什么版本?
可能是您聲明類的順序或其他問題。
#include <vector>
class A;
class B;
class C;
class A {
public:
void do_something() {};
};
class B
{
public:
std::vector<A*> elements2;
};
class C
{
public:
std::vector<B*> elements;
void do_this() {
std::vector<B*>::iterator it1;
std::vector<A*>::iterator it2;
for (it1=this->elements.begin(); it1!=this->elements.end(); ++it1)
{
for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2)
{
(*it2)->do_something(); //method of class A
}
}
};
};
int main() {
C c;
};
〜
〜
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.