自己的容器类的C++迭代器和const_iterator问题

BaC*_*aCh 14 c++ containers stl const-iterator

我正在写一个自己的容器类,遇到了一个我无法理解的问题.这是显示问题的裸骨样本.

它由一个容器类和两个测试类组成:一个使用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;
}
Run Code Online (Sandbox Code Playgroud)

gcc告诉我:

test2.C:在成员函数'void TestClassMyContainer :: test()'中:

test2.C:51:错误:从'MyContainer :: iterator'转换为非标量类型'MyContainer :: const_iterator'请求

我不确定编译器想要将迭代器转换为我自己的类的const_iterator而不是STL矢量类的位置和原因.我究竟做错了什么?

sho*_*osh 10

begin()默认情况下调用编译器时会创建对非const的调用begin().因为myc不是const,所以无法知道你的意思是使用const begin()而不是非const begin().

STL迭代器包含一个iterator转换运算符,允许将其静默转换为a const_iterator.如果你希望这个工作,你需要添加一个像这样:

class iterator
{
public:
    typedef iterator self_type;
    inline iterator() { }

    operator const_iterator() { return const_iterator(); }
};
Run Code Online (Sandbox Code Playgroud)

或者允许像这样const_iterator建造iterator:

class const_iterator
{
public:
    typedef const_iterator self_type;

    const_iterator(iterator& ) {}
    inline const_iterator() { }
};
Run Code Online (Sandbox Code Playgroud)