【发布时间】:2016-12-29 11:48:57
【问题描述】:
我想使用 boost::variant 来有效地保持以下几种不同类型的联合。
using VariantType = boost::variant<
std::shared_ptr<StructA>,
std::shared_ptr<StructB>
>;
我在Coliru 上组装了一个原型,它至少可以编译。
VariantType variant = std::make_shared<StructA>(1, 'a', 3);
boost::apply_visitor(output{}, variant);
std::cout << variant.which() << std::endl;
variant = std::make_shared<StructB>('b', 'c');
boost::apply_visitor(output{}, variant);
std::cout << variant.which() << std::endl;
按预期打印出以下内容:
g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp -lrt && ./a.out
StructA: CommonStruct: 123 1a3
0
StructB: CommonStruct: 456 bc
1
现在回到问题的关键,实际代码(在 Visual Studio 2015 中运行良好)但是它不能在 gcc 4.9.1 上编译。 (用不同的类型代替上面的 StructA 和 StructB)。有人可以帮我弄清楚这个神秘的错误消息的含义以及如何解决它。我所有的结构都是 POD 结构,其显式构造函数类似于 StructA 和 StructB 中的构造函数。
这是 gcc 4.9.1 错误消息。
error: call of overloaded 'initialize(void*, boost::move_detail::remove_reference<std::unique_ptr<ReportStatusRequest, std::default_elete<ReportStatusRequest> >&>::type)' is ambiguous.
)
^
/spare1/aaron/0339/ltib/rootfs/usr/include/boost/variant/variant.hpp:1561:17: note: candidates are:
In file included from /spare1/aaron/0339/ltib/rootfs/usr/include/boost/variant/variant.hpp:30:0,
from /spare1/aaron/0339/ltib/rootfs/usr/include/boost/variant.hpp:17,
from ../../include/fhdb/FHDBUtil.h:17,
from FHDBUtil.cpp:18:
GenericSendMessage typedef(稍后显示)中的每个变体类型都会出现此错误。这些错误消息中的每一个都伴随着许多 gcc note 警告,如下所示:
/usr/include/boost/variant/detail/initializer.hpp:115:24: note: static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param2_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list6<std::shared_ptr<ConnectRequest>, std::shared_ptr<DisconnectRequest>, std::shared_ptr<GenerateFHDBRequest>, std::shared_ptr<ReportStatusRequest>, std::shared_ptr<RetrieveFHDBRequest>, std::shared_ptr<RetrieveComplete> > > >::initializer_node, mpl_::int_<1> >, boost::mpl::l_iter<boost::mpl::list5<std::shared_ptr<DisconnectRequest>, std::shared_ptr<GenerateFHDBRequest>, std::shared_ptr<ReportStatusRequest>, std::shared_ptr<RetrieveFHDBRequest>, std::shared_ptr<RetrieveComplete> > > >::initializer_node, mpl_::int_<2> >, boost::mpl::l_iter<boost::mpl::list4<std::shared_ptr<GenerateFHDBRequest>, std::shared_ptr<ReportStatusRequest>, std::shared_ptr<RetrieveFHDBRequest>, std::shared_ptr<RetrieveComplete> > > >::initializer_node, mpl_::int_<3> >, boost::mpl::l_iter<boost::mpl::list3<std::shared_ptr<ReportStatusRequest>, std::shared_ptr<RetrieveFHDBRequest>, std::shared_ptr<RetrieveComplete> > > >::initializer_node, mpl_::int_<4> >; Iterator = boost::mpl::l_iter<boost::mpl::list2<std::shared_ptr<RetrieveFHDBRequest>, std::shared_ptr<RetrieveComplete> > >; boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param2_T = std::shared_ptr<RetrieveFHDBRequest>&&]
static int initialize(void* dest, param2_T operand)
此错误消息对应于下面定义的实际 VariantType
using GenericSendMessage = boost::variant<
std::shared_ptr<ConnectRequest>,
std::shared_ptr<DisconnectRequest>,
std::shared_ptr<GenerateFHDBRequest>,
std::shared_ptr<ReportStatusRequest>,
std::shared_ptr<RetrieveFHDBRequest>,
std::shared_ptr<RetrieveComplete>
>;
【问题讨论】:
-
你能发布一个实际的minimal reproducible example 显示这个错误吗?请发布您使用的结构的定义。也缺少 full 错误消息。您使用的是哪个增强版本?
-
不幸的是这是不可能的,首先我通过现场演示在 coliru 上复制了相同的行为,效果很好,问题是错误输出应该出现在 gcc 4.9.1 上(实际上它是在powerPC),我的最小示例是对我的问题进行精简的基本复制。实际平台问题的详细信息显示在我不明白的神秘 gcc 错误输出中 - 这是发布问题的主要原因
-
你可以在coliru上使用
g++-4.9,它编译没有任何错误coliru.stacked-crooked.com/a/f6353c2f719e6bca -
不,这只是错误消息的一部分,它只是
note部分 -
一个疯狂的猜测:您在实际代码中使用
make_unique而不是make_shared?这会引发相同的错误消息:coliru.stacked-crooked.com/a/9526f8c3e724b5c7
标签: gcc boost c++14 shared-ptr boost-variant