изо всех сил пытается реализовать простой обход boost::graph

Я изо всех сил пытаюсь реализовать простой 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 выглядит великолепно, идеально подходит для того, что мне нужно, но немного больше документации......

У меня достаточно опыта в программировании шаблонов, но я потратил на это слишком много часов, пора обратиться за помощью!


person Ken Moynihan    schedule 01.09.2013    source источник
comment
ты не хочешь boost::visitor(vis) ?   -  person Guy Sirton    schedule 02.09.2013
comment
Согласно документации, depth_first_search работает только с ориентированными графами, но с использованием boost 1.54 на g++ 4.8.1 пример с использованием опубликованных вами фрагментов, похоже, работает. Есть еще один алгоритм, который должен работать, когда ваш граф ненаправленный: undirected_dfs . Так что, возможно, вам стоит попробовать проверить, работает ли это в вашей версии Visual Studio.   -  person llonesmiz    schedule 02.09.2013
comment
@Guy Sirton: да, я знаю, это просто фрагмент того, что я много возился с кодом   -  person Ken Moynihan    schedule 02.09.2013
comment
@cv_and_he: да, я так и думал, поэтому перепробовал много комбинаций ориентированных и неориентированных графов и поиска. Выше в значительной степени взято из другого примера. Так что этот фрагмент выше работает для вас? хм....   -  person Ken Moynihan    schedule 02.09.2013
comment
@KenMoynihan Можете ли вы попытаться создать для нас меньший автономный образец, показывающий проблему?   -  person Guy Sirton    schedule 02.09.2013


Ответы (1)


Из этого 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)
  );
}
person richelbilderbeek    schedule 21.03.2017