Увеличить 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 является неполным.

  1. Можно ли решить эту проблему, имея оба класса полностью только для заголовков и неявно встроенные все методы (в большинстве случаев они содержат только несколько строк)?
  2. Если нет, то можно ли решить эту проблему с выделением некоторых методов в файлы cpp?

1 ответ

Решение

Возможно частично удовлетворить ваше первое требование, так как вы можете определить все в заголовке, кроме begin а также end это нужно будет объявить inline и определены за пределами SomeContainer определение, а после SomeIterator определение (которое завершает тип). Это предполагает, что вы сохраняете текущий порядок определения (SomeContainer до SomeIterator), которую я предлагаю вам сохранить.

В противном случае вы можете, конечно, угробить inline (неявное или иное) и определение вне определения класса. Таким образом, оба типа будут завершены из этих определений.

Другие вопросы по тегам