Ошибка компилятора с адаптером Boost Iterator - PullRequest
2 голосов
/ 01 февраля 2010

Я пытаюсь написать простой итератор STL для класса CArray MFC, используя адаптер итератора boost. Это мой код:

#include <boost/iterator/iterator_adaptor.hpp>
#include <afxtempl.h>

class CArrIter : public boost::iterator_adaptor< CArrIter , 
    int, 
    int,
    boost::random_access_traversal_tag >
{
public:
    CArrIter(CArray<int,int>& arr, int index = 0) : m_arr(arr)
    {
        this->base_reference() = index;
    }

private:
    friend class boost::iterator_core_access;
    int dereference() const{
        return m_arr.GetAt(base());
    }


private:
    CArray<int,int>& m_arr;
};

Прекрасно компилируется с компилятором VC9. Но когда я пытаюсь скомпилировать это с VC7, я получаю следующую ошибку:

\ включить \ импульс \ итератора \ iterator_traits.hpp (49) : erro r C2039: 'Разность_типов': есть не является членом «Повышение :: детали :: iterator_traits < Итератор>» с [ Итератор = INT ]

\ include \ boost \ mpl \ eval_if.hpp (41): см. ссылку на шаблон класса конкретизации 'Повышение :: iterator_difference' скомпилировано с [ Итератор = INT ]

.... Еще немного ....

Любые подсказки, что может быть не так? Я должен включить некоторые другие заголовочные файлы? Я новичок в улучшении библиотеки.

Ответы [ 2 ]

4 голосов
/ 01 февраля 2010

Я думаю, что второй параметр шаблона boost :: iterator_adaptor <> должен быть допустимым типом итератора, попробуйте использовать int * вместо int.

0 голосов
/ 01 февраля 2010

Это может быть связано с тем, что поведение произвольного доступа не имеет всего необходимого для обхода контейнера.Раздел «Требования к iterator_adaptor» этой ссылки может помочь:

Повышение: адаптер итератора

Я не уверен, что int можно назначить, поэтому мне интересно, что произойдетесли вы изменили int на int &.

Еще пара идей:

  • Используете ли вы одну и ту же версию библиотеки Boost с обоими компиляторами?
  • Делает ли разыменование() охраняемая или общественная помощь?
...