提升iterator_facade和转发声明

Boost iterator_facade and forward declarations

本文关键字:转发 声明 facade iterator 提升      更新时间:2023-10-16

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

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

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

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

问题如下。如果我在SomeiIterator之前声明SomeContainer并向前声明SomeIterator,那么编译器会抱怨SomeIterator begin()end()方法不完整的类型。但是,如果我以另一种方式执行此操作,那么问题就是相反的:SomeContainer不完整。

    是否可以在两个
  1. 类完全仅标头且所有方法都隐式内联(它们大多只包含几行)的情况下解决此问题?
  2. 如果没有,是否可以通过将某些方法分解到 cpp 文件中来解决它?
可以

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

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