
Hi all, I'm trying to use the recursive variant as following: typedef boost::make_recursive_variant< int, std::vector<boost::recursive_variant_>, std::map<std::string, boost::recursive_variant_> >::type var_t; ... var_t var(34); ... VC 8.0 can not compile with error C2079: 'std::pair<_Ty1,_Ty2>::second' uses undefined struct 'boost::recursive_variant_' Struct recursive_variant_ is declared but not implement at all. But GCC works well. I'm confused how to solve the problem. Here is the whole program: #include "boost/variant.hpp" #include <iostream> #include <sstream> #include <vector> #include <map> struct vector_printer : boost::static_visitor<std::string> { template <typename T> std::string *operator*()(const std::vector<T>& vec) const { std::ostringstream ost; ost << "( "; typename std::vector<T>::const_iterator it = vec.begin(); *for* (; it != vec.end(); ++it) ost << boost::apply_visitor( vector_printer(), *it ); ost << ") "; *return* ost.str(); } template <typename T> std::string *operator*()(const std::map<std::string, T>& m) const { std::ostringstream ost; ost << "( "; typename std::map<std::string, T>::const_iterator it = m.begin(); *for* (; it != m.end(); ++it) ost << it->first << '\t' << boost::apply_visitor( vector_printer(), it->second ); ost << ") "; *return* ost.str(); } template <typename T> std::string *operator*()(const T& operand) const { std::ostringstream ost; ost << operand << ' '; *return* ost.str(); } }; int main(int , char* []) { typedef boost::make_recursive_variant< int, std::vector<boost::recursive_variant_>, std::map<std::string, boost::recursive_variant_> >::type var_t; std::vector<var_t> vec; vec.push_back(3); vec.push_back(5); vec.push_back(vec); vec.push_back(7); var_t var(vec); std::string result( boost::apply_visitor( vector_printer(), var ) ); std::cout << "result: " << result << '\n'; *return* 0; } And the compile error from VC8 is : test_map_variant.cpp D:\Program\boost\boost_1_33_1\boost/type_traits/is_base_and_derived.hpp : warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss D:\Program\boost\boost_1_33_1\boost/utility/enable_if.hpp : warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss D:\Program\boost\boost_1_33_1\boost/type_traits/is_base_and_derived.hpp : warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss D:\Program\boost\boost_1_33_1\boost/utility/enable_if.hpp : warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss D:\Program\boost\boost_1_33_1\boost/utility/enable_if.hpp : warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss D:\Program\vs8\VC\INCLUDE\utility(54) : error C2079: 'std::pair<_Ty1,_Ty2>::second' uses undefined struct 'boost::recursive_variant_' with [ _Ty1=const std::string, _Ty2=boost::recursive_variant_ ] D:\Program\vs8\VC\INCLUDE\vector(1083) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled with [ _Ty1=const std::string, _Ty2=boost::recursive_variant_ ] D:\Program\vs8\VC\INCLUDE\vector(1082) : while compiling class template member function 'void std::vector<_Ty>::_Destroy(boost::variant<T0_,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19> *,boost::variant<T0_,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19> *)' with [ _Ty=var_t, T0_=boost::detail::variant::recursive_flag<int>, T1=std::vector<boost::recursive_variant_>, T2=std::map<std::string,boost::recursive_variant_>, T3=boost::detail::variant::void_, T4=boost::detail::variant::void_, T5=boost::detail::variant::void_, T6=boost::detail::variant::void_, T7=boost::detail::variant::void_, T8=boost::detail::variant::void_, T9=boost::detail::variant::void_, T10=boost::detail::variant::void_, T11=boost::detail::variant::void_, T12=boost::detail::variant::void_, T13=boost::detail::variant::void_, T14=boost::detail::variant::void_, T15=boost::detail::variant::void_, T16=boost::detail::variant::void_, T17=boost::detail::variant::void_, T18=boost::detail::variant::void_, T19=boost::detail::variant::void_ ] test_map_variant.cpp(63) : see reference to class template instantiation 'std::vector<_Ty>' being compiled with [ _Ty=var_t ] -- B. R. Andy