我想创建一个支持迭代器的自定义容器。它看起来像这样:
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
不完整。
答案 0 :(得分:1)
可以部分满足您的第一个要求,因为您可以在标题中定义除begin
和end
之外的所有内容,这些内容需要声明inline
并在SomeContainer
定义,以及SomeIterator
定义(完成类型)之后。这假设您保持当前的定义顺序(SomeContainer
之前SomeIterator
),我建议您保留。
否则,您当然可以放弃inline
(隐式或其他)并在类定义之外定义。通过这样做,两种类型都将从这些定义中完成。