Не могу скомпилировать boost/any_iterator.hpp в boost 1.57

После (попытки) обновить проект VS2012 для использования Boost 1.57 я больше не могу компилировать - появляется множество сообщений об ошибках boost/any_iterator.hpp (увидеть ниже). В качестве теста я создал новый проект, который не содержал ничего, кроме пустой главной функции и #include "boost/any_iterator.hpp" и получил тот же набор ошибок. Вот код, на который он жалуется:

// snippet from boost/any_iterator.hpp

template<
            class Value
          , class Traversal
          , class Reference
          , class Difference
          , class Buffer
        >
        class postfix_increment_proxy<
                    range_detail::any_iterator< // line 131
                        Value
                      , Traversal
                      , Reference
                      , Difference
                      , Buffer
                    >
                >
        {
            // ...
        };

В том же файле есть другой класс, который следует той же схеме и генерирует идентичные ошибки. range_detail::any_iterator заранее объявлено немного выше в файле:

namespace range_detail
{
   // ...
   template<
                class Value
              , class Traversal
              , class Reference
              , class Difference
              , class Buffer = any_iterator_default_buffer
            >
            class any_iterator;
    // ...
}

Для чего это стоит, вот набор ошибок, которые я получаю от VS2012:

Error   1   error C2143: syntax error : missing ';' before '<'  [path]\boost\range\detail\any_iterator.hpp  131
Error   2   error C2059: syntax error : '<' [path]\boost\range\detail\any_iterator.hpp  131
Error   3   error C2065: 'Value' : undeclared identifier    [path]\boost\range\detail\any_iterator.hpp  134
Error   4   error C2065: 'Traversal' : undeclared identifier    [path]\boost\range\detail\any_iterator.hpp  135
Error   5   error C2065: 'Reference' : undeclared identifier    [path]\boost\range\detail\any_iterator.hpp  136
Error   6   error C2065: 'Difference' : undeclared identifier   [path]\boost\range\detail\any_iterator.hpp  137
Error   7   error C2065: 'Buffer' : undeclared identifier   [path]\boost\range\detail\any_iterator.hpp  138
Error   8   error C2923: 'boost::range_detail::any_iterator' : 'Value' is not a valid template type argument for parameter 'Value'  [path]\boost\range\detail\any_iterator.hpp  138
Error   9   error C2923: 'boost::range_detail::any_iterator' : 'Traversal' is not a valid template type argument for parameter 'Traversal'  [path]\boost\range\detail\any_iterator.hpp  138
Error   10  error C2923: 'boost::range_detail::any_iterator' : 'Reference' is not a valid template type argument for parameter 'Reference'  [path]\boost\range\detail\any_iterator.hpp  138
Error   11  error C2923: 'boost::range_detail::any_iterator' : 'Difference' is not a valid template type argument for parameter 'Difference'    [path]\boost\range\detail\any_iterator.hpp  138
Error   12  error C2923: 'boost::range_detail::any_iterator' : 'Buffer' is not a valid template type argument for parameter 'Buffer'    [path]\boost\range\detail\any_iterator.hpp  138
Error   13  error C2143: syntax error : missing ';' before '{'  [path]\boost\range\detail\any_iterator.hpp  140
Error   14  error C2447: '{' : missing function header (old-style formal list?) [path]\boost\range\detail\any_iterator.hpp  140

Кто-нибудь знает об обходном пути?

1 ответ

Решение

Похоже, это ошибка в базе кодов наддува. postfix_increment_proxy а также writable_postfix_increment_proxy оба в boost::iterators::detail пространство имен (iterator_facade.hpp). Однако оба имени используются без оговорок в any_iterator.hpp. Добавление boost::iterators::detail:: перед обоими именами позволяет код для компиляции.

Для тех, кому не нравится идея редактирования буст-кода, включая iterator_facade.hpp, за которым следует using namespace boost::iterators::detail последующее включение для any_iterator.hpp также решит проблему за счет загрязнения пространства имен. VS2012 не поддерживает их, поэтому не приносит никакой пользы, но вы также можете использовать C++11.

Билет отправлен: https://svn.boost.org/trac/boost/ticket/10754

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