2014-10-18 34 views
-1

我有这种类型的重写型使用boost :: recursive_wrapper代替的boost :: 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

编辑:其实我不知道为什么它不工作。事实证明,在我所关联的问题的答案中提到的拉取请求已被合并以提高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. 

所以我想我应该把它改写使用boost :: recursive_wrapper代替。但我该怎么做?我不能转发 - 声明将使用“using”或“typedef”定义的类型,我可以吗?

回答

1

无视我在问题中写的所有内容。原来答案是你需要使用::类型与升压:: make_recursive_variant定义一些类型:

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

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

同一作品甚至对正在使用的实际递归和std ::元组代码。

相关问题