2017-08-07 48 views
1

我正在使用boost库创建一个简单的图形,并试图遍历顶点和边。不过,我收到以下错误,其中的代码可以遍历所有顶点,但有一个编译问题,当我加入的代码的最后一段,其负责遍历边缘:Boost图形转换错误

error: conversion from ‘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 > >’ to non-scalar type ‘std::pair, boost::detail::out_edge_iter<__gnu_cxx::__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<__gnu_cxx::__normal_iterator*, std::vector, std::allocator > > >, long unsigned int, boost::detail::edge_desc_impl, long int>, boost::adjacency_list<> > >’ requested 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; 
} 

回答

4

您将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); 

更多细节:你的类型digraph指定adjacency_list 3个模板参数:

typedef adjacency_list< listS, vecS, directedS > digraph; 

你叫edges这种类型的参数,但是您可以指定函数的EdgeIterator模板参数必须是boost::adjacency_list<>::edge_iterator,仿佛gadjacency_list<>类型,而不是adjacency_list<listS, vecS, directedS>的。显然该转换适用于adjacency_list<>::vertex_iterator,但不是adjacency_list<>::edge_iterator

+0

谢谢,通过使用std :: pair es = boost :: edges(g); – Mohannad