2016-02-10 23 views
1

我使用Boost 1.60 adjacency_list並想用slistS爲模板參數OutEdgeListBGL中slistS發生了什麼?

using Graph = boost::adjacency_list< 
       boost::slistS, boost::listS, boost::bidirectionalS 
       >; 

這並不編譯。

#if !defined BOOST_NO_SLIST 
# ifdef BOOST_SLIST_HEADER 
# include BOOST_SLIST_HEADER 
# else 
# include <slist> 
# endif 
#endif 

#if !defined BOOST_NO_SLIST 
    struct slistS {}; 
#endif 

是沒可能使用std::forward_listboost::slistS:看adjacency_list.hpp看來這類型是明確在沒有老STL std::slist的去除?如果沒有,是否有計劃在未來的BGL版本中包含這些內容?

回答

2

這對我來說似乎是特定於Clang/LibC++,其中缺少<slist>。它不是C++標準的一部分。

用GCC/libstdC++編譯很好(用GCC 5.2和C++ 14測試)。

所以我只是用boost::container::slist

Live On Coliru

#include <boost/container/slist.hpp> 
#include <boost/graph/adjacency_list.hpp> 

#ifdef BOOST_NO_SLIST 
namespace boost { 
    struct slistS; 

    template <class ValueType> struct container_gen<slistS, ValueType> { 
     typedef boost::container::slist<ValueType> type; 
    }; 

    template <> struct parallel_edge_traits<slistS> { typedef allow_parallel_edge_tag type; }; 
} 
#endif 

int main() { 
    using namespace boost; 
    adjacency_list<vecS, slistS> works_for_me; 
} 
+0

假設例子應該使用'slitstS'而不是'listS'?另外,你知道是否可以/安全地使用'std :: forward_list'來代替'boost :: slist'嗎? – Daniel

+0

是的。確實。 [只要'.size()'不是必需的](http://stackoverflow.com/questions/6885436/what-is-the-difference-between-stl-slist-and-c0x-forward-list)是沒有理由爲什麼不 – sehe

+0

我認爲你錯過了一些'boost :: graph_detail :: container_traits'專業化。 – Daniel