2014-10-18 1 views
-1

У меня есть этот типRewrite тип использовать повышение :: recursive_wrapper вместо усиления :: make_recursive вариант

using expression = boost::make_recursive_variant< 
    number, 
    std::tuple< 
     boost::recursive_variant_, 
     binary_operator, 
     boost::recursive_variant_ 
    > 
>; 

Это не имеет значения, что binary_operator есть, этот тип не работает из-за этого Using boost::make_recursive_variant with tuple

EDIT: на самом деле я не знаю, почему это не работает. Оказывается, запрос на загрузку, упомянутый в ответе на вопрос, который я связал, был объединен, чтобы увеличить 1.56.0, это означает, что проблема лежит где-то в другом месте. Вот минимальная программа, которая показывает проблему:

#include <boost/variant.hpp> 
#include <boost/variant/recursive_variant.hpp> 

#include <tuple> 

struct A {}; 
struct B {}; 

using working_variant = boost::variant< 
    A, 
    B 
>; 

using not_working_variant = boost::make_recursive_variant< 
    A, 
    std::tuple< 
     boost::recursive_variant_, 
     B, 
     boost::recursive_variant_ 
    > 
>; 

int main() { 
    working_variant x = A(); 
    not_working_variant y = A(); 
} 

И ошибка компиляции:

$ clang++ -stdlib=libc++ -std=c++14 -isystem ~/soft/boost_1_56_0/ min.cpp 
min.cpp:25:25: error: no viable conversion from 'A' to 'not_working_variant' (aka 'make_recursive_variant<A, std::tuple<boost::recursive_variant_, B, 
     boost::recursive_variant_> >') 
    not_working_variant y = A(); 
         ^ ~~~ 
/home/crabman/soft/boost_1_56_0/boost/variant/recursive_variant.hpp:176:8: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 
     'A' to 'const boost::make_recursive_variant<A, std::__1::tuple<boost::recursive_variant_, B, boost::recursive_variant_>, boost::detail::variant::void_, 
     boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, 
     boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, 
     boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, 
     boost::detail::variant::void_, boost::detail::variant::void_> &' for 1st argument 
struct make_recursive_variant 
    ^
/home/crabman/soft/boost_1_56_0/boost/variant/recursive_variant.hpp:176:8: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 
     'A' to 'boost::make_recursive_variant<A, std::__1::tuple<boost::recursive_variant_, B, boost::recursive_variant_>, boost::detail::variant::void_, 
     boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, 
     boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, 
     boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, 
     boost::detail::variant::void_, boost::detail::variant::void_> &&' for 1st argument 
struct make_recursive_variant 
    ^
1 error generated. 

Так что я думаю, я должен переписать его, чтобы использовать повышение :: recursive_wrapper вместо этого. Но как мне это сделать? Я не могу переслать-объявить тип, который будет определен с помощью «использования» или «typedef», не так ли?

ответ

1

Не обращайте внимания на все, что я написал в вопросе. Оказывается, ответ вам нужно использовать :: тип определить некоторый тип с буст :: make_recursive_variant:

using working_variant = boost::variant< 
    A, 
    B 
>; 

using working_recursive_variant = boost::make_recursive_variant< 
    A, 
    B 
>::type; 

Same работает даже для кода с используется фактическая рекурсии и станд :: кортеж.

Смежные вопросы