У меня есть этот тип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», не так ли?