2012-02-12 4 views
4

Я декодирую bencode и имею некоторый код, который хорошо работает с gcc 4.4. Но будучи недавно обновлен до GCC 4.6 этот код больше не строит:Как сделать рекурсивный boost :: variant, который работает с 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 

г ++ дает следующее сообщение об ошибке:

/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_' 

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

ответ

4

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

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

Я была такая же проблема и нашли решение в boost variant recursive