Как сделать рекурсивный Boost :: вариант, который работает с GCC 4.6? - PullRequest
4 голосов
/ 13 февраля 2012

Я декодирую bencode, и у меня есть код, который хорошо работает с gcc 4.4. Но после недавнего обновления до gcc 4.6 этот код больше не собирается:

#ifndef BENCODE_VALUETYPES_H
#define BENCODE_VALUETYPES_H

#include <boost/variant.hpp>

#include <string>
#include <vector>
#include <map>

namespace bencode {

  typedef boost::make_recursive_variant<
    int,
    std::string,
    std::vector<boost::recursive_variant_>,
    std::map<std::string, boost::recursive_variant_> >::type Value;

  typedef std::map<std::string, Value> ValueDictionary;
  typedef std::vector<Value> ValueVector;

};

#endif

g ++ выдает это сообщение об ошибке:

/usr/include/c++/4.6/bits/stl_pair.h: In instantiation of 'std::pair<const std::basic_string<char>, boost::recursive_variant_>':
Decoder.cpp:97:39:   instantiated from here
/usr/include/c++/4.6/bits/stl_pair.h:93:11: error: 'std::pair<_T1, _T2>::second' has incomplete type
/usr/include/boost/variant/variant_fwd.hpp:232:12: error: forward declaration of 'struct boost::recursive_variant_'

Документация для последней версии надстройки (на данный момент 1.48) гласит, что "из-за стандартных проблем совместимости в нескольких компиляторах make_recursive_variant не поддерживается универсально", и что вместо этого вы должны использовать recursive_wrapper. Но у меня возникла проблема с внесением изменений: кто-нибудь знает, как это должно выглядеть при использовании обертки?

1 Ответ

4 голосов
/ 08 апреля 2012

Попробуйте определить ниже в вашем заголовочном файле, прежде чем включать заголовки варианта Boost.

#define BOOST_VARIANT_NO_FULL_RECURSIVE_VARIANT_SUPPORT
#include <boost/variant.hpp>

У меня была та же проблема, и я нашел решение в рекурсивном варианте Boost

...