提升iterator_facade和转发声明

时间:2012-08-14 19:02:46

标签: c++ crtp boost-iterators

我想创建一个支持迭代器的自定义容器。它看起来像这样:

class SomeContainer {
    ...
public:
    typedef SomeIterator iterator;
    iterator begin() { ... }
    iterator end() { ... }
};

然后我为此创建一个迭代器:

class SomeIterator: public boost::iterator_facade<
         SomeIterator, 
         SomeType,
         boost::bidirectional_traversal_tag> {
    ...
}

这个问题如下。如果我在SomeContainer之前声明SomeiIterator并转发声明SomeIterator,那么编译器会抱怨begin()end()方法SomeIterator不完整类型。但是,如果我以其他方式执行此操作,则问题恰恰相反:SomeContainer不完整。

  1. 是否有可能解决这个问题,同时让两个类完全只有标题,并且所有方法都隐式内联(它们通常只包含几行)?
  2. 如果没有,是否可以通过将某些方法分解为cpp文件来解决它?

1 个答案:

答案 0 :(得分:1)

可以部分满足您的第一个要求,因为您可以在标题中定义除beginend之外的所有内容,这些内容需要声明inline并在SomeContainer定义,以及SomeIterator定义(完成类型)之后。这假设您保持当前的定义顺序(SomeContainer之前SomeIterator),我建议您保留。

否则,您当然可以放弃inline(隐式或其他)并在类定义之外定义。通过这样做,两种类型都将从这些定义中完成。