我(成功地)为BFS实现了自定义访问者:
(另请参见:Find all reachable vertices in a Boost BGL graph using BFS)
...
...
ListVisitor vis;
boost::breadth_first_visit(mListGraph, start, Q, vis, colormap);
在我的头文件中定义的访问者:
class ListVisitor : public boost::default_bfs_visitor
{
public:
template <typename Vertex, typename Graph>
void discover_vertex(Vertex u, const Graph& /*g*/) const
{
std::cout << u << std::endl;
}
};
这可以按预期工作...所以一切都很好。 :-)
但是我想更改代码以改为使用make_bfs_visitor
并像这样更改我的代码:
boost::breadth_first_visit(mListGraph, start, Q,
boost::visitor(
boost::make_bfs_visitor(
ListVisitor<boost::on_discover_vertex>()
)
), colormap);
和.h中:
template <typename event_type>
struct ListVisitor : public boost::default_bfs_visitor
{
using event_filter = event_type;
template<typename GRAPH>
void operator()(GRAPH::vertex_descriptor vert, const GRAPH& graph) const
{
std::cout << u << std::endl;
}
};
不幸的是,这会产生错误:
Error C2061 syntax error: identifier 'vertex_descriptor'
我还尝试使用实型而不是模板化类型:
void operator()(ListGraph_t::vertex_descriptor vert, const ListGraph_t& graph) const
但它只会更改错误:
Error C2039 'discover_vertex': is not a member of ...
Error C2039 'examine_vertex': is not a member of ...
Error C2039 'examine_edge': is not a member of ...
and so on..........
我的问题:
答案 0 :(得分:1)
您需要使用KAFKA -> PROCESS(STORE IN DB) -> KAFKA
来指示typename
中的vertex_descriptor
是一种类型:
GRAPH
Boost有一个不错的库template<typename GRAPH>
void operator()(typename GRAPH::vertex_descriptor vert, const GRAPH& graph) const
^^^^^^^^
{
std::cout << u << std::endl;
}
,我用它来打印两种类型:
type_index.hpp
输出为
auto v = boost::make_bfs_visitor(ListVisitor<boost::on_discover_vertex>());
cout << boost::typeindex::type_id_with_cvr<decltype(v)>().pretty_name() << endl;
boost::bfs_visitor<ListVisitor<boost::on_discover_vertex> >
具有bfs_visitor
,discover_vertex
等方法。
现在,我们打印您的访问者的类型:
examine_vertex
作为输出
auto v2 =
boost::visitor(boost::make_bfs_visitor(ListVisitor<boost::on_discover_vertex>()));
^^^ ^^^
cout << boost::typeindex::type_id_with_cvr<decltype(v2)>().pretty_name() << endl;
这就是为什么编译器会抱怨boost::bgl_named_params<boost::bfs_visitor<ListVisitor<boost::on_discover_vertex> >,
boost::graph_visitor_t, boost::no_property>
不是X
的成员。
因此您需要致电
bgl_named_params
这两个更改之后,您的代码可以正常编译。