這裏我可以從日誌中收集什麼,以及我對於失敗原因的推論。
簡版:出於某種原因BOOST_FOREACH
試圖複製不可能的數據。
還有就是Extensibility頁面上的提示:
使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<> const
建立一個新的boost::intrusive::list<>
。
最有前途的構造是由一個宏定義:
BOOST_MOVABLE_BUT_NOT_COPYABLE(list)
它擴展到
list(list&);
這是提升的方式模擬移動爲不可複製的類型在C++ 03的語義。但由於const
限定符將丟失,因此它不能從const
項目移動。
這似乎是BOOST_FOREACH
爲避免對容器參數的多重評估(如果它是一個函數調用)所使用的詭計的一部分,儘管我有點驚訝它試圖在這裏複製參數。
還是接受提升不支持clang? –
不可接受。它仍然會失敗,gcc-4.6.3,我最終會編寫常規for循環。 –
如果我們實際上可以看到兩個編譯器的錯誤消息,那將很酷。 –