以下是我可以从日志中收集到的信息以及我对失败原因的推断。
短版:由于某种原因BOOST_FOREACH
,试图复制不可能的数据。
可扩展性页面上有一条注释:
使用不可BOOST_FOREACH
复制的序列类型
对于不可复制的序列类型,我们需要告诉BOOST_FOREACH
不要尝试进行复制。如果我们的类型继承自boost::noncopyable
,则不需要进一步的操作。如果没有,我们必须专门化boost::foreach::is_noncopyable<>
模板 [...] 实现相同效果的另一种方法是覆盖全局boost_foreach_is_noncopyable()
函数。这样做的好处是可以移植到旧的编译器。
从诊断来看,还不清楚类型是否配置正确,因此您可能想试一试。
修剪诊断和分析。
/usr/include/boost/foreach.hpp:571:37: error: no matching constructor for initialization of 'boost::intrusive::list< >'
::new(this->data.address()) T(t);
^ ~
/usr/include/boost/foreach.hpp:648:51: note: in instantiation of member function 'boost::foreach_detail_::simple_variant<boost::intrusive::list< > >::simple_variant' requested here
return auto_any<simple_variant<T> >(*rvalue ? simple_variant<T>(t) : simple_variant<T>(&t));
^
/usr/include/boost/intrusive/list.hpp:1490:35: note: candidate constructor not viable: 1st argument ('const boost::intrusive::list< >') would lose const qualifier
BOOST_MOVABLE_BUT_NOT_COPYABLE(list)
^
/usr/include/boost/move/move.hpp:371:7: note: expanded from macro 'BOOST_MOVABLE_BUT_NOT_COPYABLE'
TYPE(TYPE &);\
/usr/include/boost/intrusive/list.hpp:1497:4: note: candidate constructor not viable: no known conversion from 'const boost::intrusive::list< >' to 'const value_traits' (aka 'const boost::intrusive::detail::base_hook_traits<boost::intrusive::list_base_hook< >, boost::intrusive::list_node_traits<void *>, 1, boost::intrusive::default_tag, 1>') for 1st argument;
list(const value_traits &v_traits = value_traits())
^
/usr/include/boost/intrusive/list.hpp:1506:4: note: candidate constructor not viable: no known conversion from 'const boost::intrusive::list< >' to '::boost::rv<list< >> &' for 1st argument;
list(BOOST_RV_REF(list) x)
^
/usr/include/boost/intrusive/list.hpp:1502:4: note: candidate constructor template not viable: requires at least 2 arguments, but 1 was provided
list(Iterator b, Iterator e, const value_traits &v_traits = value_traits())
^
我试图尽可能多地隔离错误(删除回溯等)。显然问题源于boost::intrusive::list
,更准确地说,无法boost::intrusive::list<>
从boost::intrusive::list<> const
.
最有希望的构造函数由宏定义:
BOOST_MOVABLE_BUT_NOT_COPYABLE(list)
扩展到
list(list&);
这是 boost 模拟 C++03 中不可复制类型的移动语义的方式。但是它不能从一个const
项目中移动,因为const
限定符会丢失。
这看起来是用于BOOST_FOREACH
避免对容器参数进行多次评估(如果它是函数调用)所使用的技巧的一部分,尽管我有点惊讶它试图在此处复制参数。