【问题标题】:Boost graph conversion errorBoost 图形转换错误
【发布时间】:2018-01-15 06:38:30
【问题描述】:

我正在使用 boost 库创建一个简单的图形,并尝试迭代顶点和边。但是我收到以下错误,代码可以迭代所有顶点,但是当我添加负责迭代边缘的最后一段代码时出现编译问题:

错误:从 'std::pair, boost::detail::out_edge_iter >, long unsigned int, boost::detail::edge_desc_impl, long int>, boost::adjacency_list >, boost::detail:: 转换adj_list_edge_iterator, boost::detail::out_edge_iter >, long unsigned int, boost::detail::edge_desc_impl, long int>, boost::adjacency_list > >' 到非标量类型'std::pair, boost::detail: :out_edge_iter<:__normal_iterator std::vector std::allocator> > >, long unsigned int, boost::detail::edge_desc_impl, long int>, boost::adjacency_list >, boost::detail ::adj_list_edge_iterator, boost::detail::out_edge_iter<:__normal_iterator std::vector std::allocator> > >, long unsigned int, boost::detail::edge_desc_impl, long int>, boost:: adjacency_list > >' 已请求 boost::adjacency_list::edge_iterator> es = boost::edges(g);

这是我的代码

#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
int main()
{
    using namespace std;
    using namespace boost;

   typedef adjacency_list< listS, vecS, directedS > digraph;

   // instantiate a digraph object with 8 vertices
   digraph g(8);

   // add some edges
   add_edge(0, 1, g);
   add_edge(1, 5, g);
   add_edge(5, 6, g);
   add_edge(2, 3, g);
   add_edge(2, 4, g);
   add_edge(3, 5, g);
   add_edge(4, 5, g);
   add_edge(5, 7, g);

   // represent graph in DOT format and send to cout
   write_graphviz(cout, g);


   std::cout<< "+++++++++++++++++++++++++++++++++++++\n";
   std::cout<<"Print Vertices\n";

   std::pair<boost::adjacency_list<>::vertex_iterator,
      boost::adjacency_list<>::vertex_iterator> vs = boost::vertices(g);

    std::copy(vs.first, vs.second,std::ostream_iterator<boost::adjacency_list<>::vertex_descriptor>{
        std::cout, "\n"});


    std::cout<< "+++++++++++++++++++++++++++++++++++++\n";
    std::cout<<"Print Edges\n";

    std::pair<boost::adjacency_list<>::edge_iterator,
        boost::adjacency_list<>::edge_iterator> es = boost::edges(g);

      std::copy(es.first, es.second,std::ostream_iterator<boost::adjacency_list<>::edge_descriptor>{
          std::cout, "\n"});

   return 0;
}

【问题讨论】:

    标签: c++ boost graph


    【解决方案1】:

    您将edges 的结果分配给不兼容类型的变量。而不是

    std::pair<boost::adjacency_list<>::edge_iterator,
        boost::adjacency_list<>::edge_iterator> es = boost::edges(g);
    

    使用

    auto es = boost::edges(g);
    

    std::pair<digraph::edge_iterator, digraph::edge_iterator> es = boost::edges(g);
    

    更多细节:您的类型digraphadjacency_list 指定了三个模板参数:

    typedef adjacency_list< listS, vecS, directedS > digraph;
    

    您使用此类型的参数调用edges,但您指定函数的EdgeIterator 模板参数必须是boost::adjacency_list&lt;&gt;::edge_iterator,就好像g 的类型是adjacency_list&lt;&gt; 而不是adjacency_list&lt;listS, vecS, directedS&gt;。显然,转换对adjacency_list&lt;&gt;::vertex_iterator 有效,但对adjacency_list&lt;&gt;::edge_iterator 无效。

    【讨论】:

    • 谢谢,使用 std::pair<:edge_iterator digraph::edge_iterator> es = boost::edges(g);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2013-08-24
    相关资源
    最近更新 更多