![](/img/trans.png)
[英]C++ How to make converting from iterator to const_iterator for own iterator class?
[英]C++ iterator and const_iterator problem for own container class
我正在寫一個自己的容器類,遇到了一個我無法理解的問題。 這是顯示問題的裸骨樣本。
它由一個容器類和兩個測試類組成:一個使用std:vector的測試類,它可以很好地編譯,第二個測試類試圖以完全相同的方式使用我自己的容器類但是很難編譯。
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
template <typename T>
class MyContainer
{
public:
class iterator
{
public:
typedef iterator self_type;
inline iterator() { }
};
class const_iterator
{
public:
typedef const_iterator self_type;
inline const_iterator() { }
};
iterator begin() {
return iterator();
}
const_iterator begin() const {
return const_iterator();
}
};
// This one compiles ok, using std::vector
class TestClassVector
{
public:
void test() {
vector<int>::const_iterator I=myc.begin();
}
private:
vector<int> myc;
};
// this one fails to compile. Why?
class TestClassMyContainer
{
public:
void test(){
MyContainer<int>::const_iterator I=myc.begin();
}
private:
MyContainer<int> myc;
};
int main(int argc, char ** argv)
{
return 0;
}
gcc告訴我:
test2.C:在成員函數'void TestClassMyContainer :: test()'中:
test2.C:51:錯誤:從'MyContainer :: iterator'轉換為非標量類型'MyContainer :: const_iterator'請求
我不確定編譯器想要將迭代器轉換為我自己的類的const_iterator而不是STL矢量類的位置和原因。 我究竟做錯了什么?
當你調用begin()
,默認情況下編譯器會創建對非const begin()
的調用。 由於myc
不是const,因此無法知道你的意思是使用const begin()
而不是非const begin()
。
STL迭代器包含一個轉換運算符,它允許將iterator
靜默轉換為const_iterator
。 如果你希望這個工作,你需要添加一個像這樣:
class iterator
{
public:
typedef iterator self_type;
inline iterator() { }
operator const_iterator() { return const_iterator(); }
};
或者允許從iterator
構造const_iterator
,如下所示:
class const_iterator
{
public:
typedef const_iterator self_type;
const_iterator(iterator& ) {}
inline const_iterator() { }
};
在容器中, iterator
類型必須可以轉換為const_iterator
。 對於使用非可變(const)迭代器迭代可變容器的情況,需要它,因為這非常有意義。 在你的情況下, myc
是可變的(非const),但你在它上面創建一個const迭代器。
您應該查看Boost.Iterators庫,尤其是iterator_facade
和iterator_adaptor
部分。 它們包含“從頭開始”構建迭代器。
它將向您展示如何在沒有太多重復的情況下編寫迭代器,因為除了const
限定本身之外,大多數時候const和非const版本的代碼大致相同。 使用模板可以編寫一次,然后聲明兩種不同的類型,這就是庫文檔說明的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.