我正在努力实现一个简单的boost :: graph。我试过阅读我能找到的所有文档和例子......
这是我的代码(从StackOverflow上的其他示例复制而来)
顶点:
class customvertex
{
public:
double some_member;
};
访客:
class MyVisitor : public boost::default_dfs_visitor
{
public:
void discover_vertex(MyGraphVertex v, const MyGraph& g) const
{
std::cout << v << std::endl;
return;
}
};
typedef声明:
typedef boost::adjacency_list<boost::vecS,boost::vecS,boost::undirectedS, customvertex> MyGraph;
typedef boost::graph_traits<MyGraph>::vertex_descriptor MyGraphVertex;
导致问题的代码:
MyGraph theGraph;
customvertex a;
MyGraphVertex vert_a = boost::add_vertex(a, theGraph);
customvertex b;
MyGraphVertex vert_b = boost::add_vertex(b, theGraph);
boost::add_edge(vert_a , vert_b, theGraph);
MyVisitor vis;
boost::depth_first_search(theGraph, boost::visitor(MyVisitor()));
对depth_first_search的最后调用会导致编译器抛出112行级联错误 概念似乎是IncidenceGraphConcept和MultiPassInputIterator
关键部分似乎是:
1> T:\boost\boost_1_47_0\boost/concept/detail/msvc.hpp(23) : while compiling class template member function 'void boost::concepts::check<Model>::failed(Model *)'
1> with
1> [
1> Model=boost::SignedInteger<int>
1> ]
1> T:\boost\boost_1_47_0\boost/graph/depth_first_search.hpp(83) : see reference to function template instantiation 'void boost::function_requires<boost::concepts::IncidenceGraphConcept<G>>(Model *)' being compiled
1> with
1> [
1> G=MyGraph,
1> Model=boost::concepts::IncidenceGraphConcept<MyGraph>
1> ]
1> T:\boost\boost_1_47_0\boost/graph/depth_first_search.hpp(202) : see reference to function template instantiation 'void boost::detail::depth_first_visit_impl<VertexListGraph,DFSVisitor,ColorMap,boost::detail::nontruth2>(const IncidenceGraph &,unsigned int,DFSVisitor &,ColorMap,TerminatorFunc)' being compiled
1> with
1> [
1> VertexListGraph=MyGraph,
1> DFSVisitor=const MyVisitor,
1> ColorMap=boost::shared_array_property_map<boost::default_color_type,boost::vec_adj_list_vertex_id_map<boost::property<boost::vertex_bundle_t,customvertex>,unsigned int>>,
1> IncidenceGraph=MyGraph,
1> TerminatorFunc=boost::detail::nontruth2
1> ]
任何和所有帮助最受赞赏。 我确信我错过了一些简单的东西,我通常可以从例子中找出答案。我认为boost :: graph看起来很棒,非常适合我需要的东西,但需要更多文档......
我在模板编程方面经验丰富,但我现在花了太多时间在这上面,是时候寻求帮助了!
答案 0 :(得分:0)
从this GitHub我复制了一个类似的工作(和测试)示例:
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/graph/visitors.hpp>
#include <boost/graph/depth_first_search.hpp>
struct Node
{
Node(const int t = 0) : m_t{t} {}
int m_t;
};
/// A phylogeny is a graph of Node of different generations
/// connected by ancestry
using phylogeny = boost::adjacency_list<
boost::vecS,
boost::vecS,
boost::undirectedS,
Node
>;
using phylogeny_vd = boost::graph_traits<phylogeny>::vertex_descriptor;
class my_visitor : public boost::default_dfs_visitor
{
public:
void discover_vertex(phylogeny_vd vd, const phylogeny& g) const
{
std::cout << g[vd].m_t << std::endl;
}
};
//Create a phylogeny
//
// b---c---d
// |
// a---+
// |
// e---f---g
//
// ---+---+---+---+---
// 0 1 2 3 t (generation)
phylogeny create_phylogeny()
{
phylogeny p;
const auto a = boost::add_vertex(Node(0), p);
const auto b = boost::add_vertex(Node(1), p);
const auto c = boost::add_vertex(Node(2), p);
const auto d = boost::add_vertex(Node(3), p);
const auto e = boost::add_vertex(Node(1), p);
const auto f = boost::add_vertex(Node(2), p);
const auto g = boost::add_vertex(Node(3), p);
boost::add_edge(a, b, p);
boost::add_edge(b, c, p);
boost::add_edge(c, d, p);
boost::add_edge(a, e, p);
boost::add_edge(f, g, p);
return p;
}
int main()
{
const phylogeny p = create_phylogeny();
my_visitor v;
boost::depth_first_search(
p,
boost::visitor(v)
);
}