Увеличить iterator_facade и форвардные объявления
Я хочу создать пользовательский контейнер, который поддерживает итераторы. Это выглядит так:
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
является неполным.
- Можно ли решить эту проблему, имея оба класса полностью только для заголовков и неявно встроенные все методы (в большинстве случаев они содержат только несколько строк)?
- Если нет, то можно ли решить эту проблему с выделением некоторых методов в файлы cpp?
1 ответ
Возможно частично удовлетворить ваше первое требование, так как вы можете определить все в заголовке, кроме begin
а также end
это нужно будет объявить inline
и определены за пределами SomeContainer
определение, а после SomeIterator
определение (которое завершает тип). Это предполагает, что вы сохраняете текущий порядок определения (SomeContainer
до SomeIterator
), которую я предлагаю вам сохранить.
В противном случае вы можете, конечно, угробить inline
(неявное или иное) и определение вне определения класса. Таким образом, оба типа будут завершены из этих определений.