【问题标题】:compilation fails for nested boost::variant of fusion pairs融合对的嵌套 boost::variant 编译失败
【发布时间】:2017-07-06 07:38:03
【问题描述】:

以下代码无法在 gcc 4.9.2 和 boost 1.64 上编译:

#include <boost/fusion/support/pair.hpp>
#include <boost/mpl/int.hpp>
#include <boost/variant.hpp>

#include <string>

namespace bf = boost::fusion;
namespace bm = boost::mpl;

int
main(int argc, char** argv)
{
    using L2_t = boost::variant<bf::pair<bm::int_<1>,char>>;
    using L1_t = boost::variant<bf::pair<bm::int_<1>,L2_t>>;
    L1_t result;
}

虽然我认为,但这是合法的。

错误信息以:

开头
/home/vagrant/.conan/data/boost/1.64.0/conaned/master/package/b06f2a498643ee1d889c6aea8e0e21d3cac9f57c/include/boost/fusion/support/pair.hpp: In instantiation of ‘constexpr boost::fusion::pai
r<First, Second>::pair(const boost::fusion::pair<First, Second2>&) [with Second2 = boost::variant<boost::fusion::pair<mpl_::int_<1>, char> >; First = mpl_::int_<1>; Second = char]’:          /home/vagrant/.conan/data/boost/1.64.0/conaned/master/package/b06f2a498643ee1d889c6aea8e0e21d3cac9f57c/include/boost/type_traits/is_constructible.hpp:33:45:   required by substitution of ‘tem
plate<class T, class Arg, class> static boost::type_traits::yes_type boost::detail::is_constructible_imp::test1(int) [with T = boost::fusion::pair<mpl_::int_<1>, char>; Arg = const boost::fus
ion::pair<mpl_::int_<1>, boost::variant<boost::fusion::pair<mpl_::int_<1>, char> > >&; <template-parameter-1-3> = <missing>]’

当我更改其中一个键值以使它们不同时,编译成功。

如何解决这个问题?我使用这些键值对来序列化/反序列化,因此在不同级别上让它们具有相同的值对我来说很重要。

【问题讨论】:

  • 看起来它开始在 gcc 5.2 中工作:wandbox.org/permlink/o4IpZbyohgECH7kO
  • 对!谢谢提醒在线编译,我忘记了。不去那里检查是愚蠢的。
  • 如果您查看更改日志(尤其是解决了哪些错误),在 4.9 后期和 5.x 早期版本中修复了很多 C++11 错误。甚至一些缺失的功能仍在实现中。感谢您发布一个完整的示例,使复制/粘贴到在线编译器变得简单。

标签: c++ c++11 boost c++14


【解决方案1】:

正如 xaxxon 所说,这从 gcc 5.2 开始工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多