Используйте boost :: опционально вместе с boost :: adapters :: indirected - PullRequest
9 голосов
/ 25 мая 2011

Я пытаюсь скомпилировать следующий код:

#include <iostream>
#include <iterator>
#include <vector>

#include <boost/assign/std/vector.hpp>
#include <boost/optional.hpp>
#include <boost/range/adaptor/indirected.hpp>
#include <boost/range/algorithm/copy.hpp>

int main( int argc, char ** argv )
{
  using namespace boost::assign;
  using boost::adaptors::indirected;

  std::vector<boost::optional<unsigned> > values;
  values += 1u,2u,3u;
  boost::copy( values | indirected, std::ostream_iterator<unsigned>( std::cout, " " ) );
  std::cout << std::endl;
}

Однако я получил некоторые ошибки, например, что в boost::optional<unsigned> нет типа с именем element_type.Однако на странице справки говорится, что единственным предварительным условием является наличие унарной функции operator*().Есть ли способ заставить его работать?

Ответы [ 2 ]

7 голосов
/ 25 мая 2011

Это определенно ошибка в Boost, но обсуждается ли эта ошибка в Boost.Optional или Boost.Iterator (я бы сказал, последнее), лично).

Однако, исправление тривиально - прежде чем включать любые заголовки Boost, сделайте это:

#include <boost/optional/optional_fwd.hpp>
#include <boost/pointee.hpp>

namespace boost
{
    template<typename P>
    struct pointee<optional<P> >
    {
        typedef typename optional<P>::value_type type;
    };
}

Затем добавьте другие заголовки Boost, если необходимо.

Пожалуйста, отправьте заявку в Boost Trac или, по крайней мере, опубликуйте отчет об ошибке в Boost Users список рассылки .

1 голос
/ 25 мая 2011

Посмотрите на частный файл option.hpp, определенный в библиотеке boost iostreams здесь . Вы увидите, что он определяет typedef T element_type;

Тем не менее, фактический файл extra.hpp, который вы используете, определяет здесь не определяет его Вот почему компилятор жалуется. Я не знаю, почему это упустили.

Попробуйте решить эту проблему с помощью частного файла option.hpp из библиотеки iostreams. Надеюсь, это поможет.

...