2013-07-11 6 views
1

Я пытаюсь повысить :: библиотеку заголовков графа, но я до сих пор не могу добавить вертикулы к моему графику.boost :: graph add_vertex ошибка компиляции

Вот как я использую add_vertex функцию:

void GraphManager::addToGraph(VertexProperties node){ 

    //no error, but i do not need it 
    vertex_t v = boost::add_vertex(graph); 

    //compilation error 
    vertex_t v = boost::add_vertex(node, graph); 

    /*...*/ 
} 

Мои определения здесь:

#ifndef GRAPH_DEFINITION_H 
#define GRAPH_DEFINITION_H 

#include <boost/graph/adjacency_list.hpp> 
#include "matchedword.h" 

typedef MatchedWord* VertexProperties; 

struct EdgeProperties 
{ 
    int distance; 
    EdgeProperties() : distance(0) {} 
    EdgeProperties(int d) : distance(d) {} 
}; 

struct GraphProperties { 

}; 

typedef boost::adjacency_list< 
    boost::vecS, boost::vecS, boost::undirectedS, 
    boost::property<VertexProperties, boost::vertex_bundle_t>, 
    boost::property<EdgeProperties, boost::edge_bundle_t>, 
    boost::property<GraphProperties, boost::graph_bundle_t> 
> Graph; 

typedef boost::graph_traits<Graph>::vertex_descriptor vertex_t; 
typedef boost::graph_traits<Graph>::edge_descriptor edge_t; 


#endif // GRAPH_DEFINITION_H 

Любая идея? Спасибо.

error: no matching function for call to 'add_vertex(MatchedWord*&, Graph&)' candidates are: [...] template typename Config::vertex_descriptor boost::add_vertex(const typename Config::vertex_property_type&, boost::adj_list_impl&)

note: template argument deduction/substitution failed:

note: 'Graph {aka boost::adjacency_list, boost::property, boost::property >}' is not derived from 'boost::adj_list_impl'

Я не понимаю смысла этого выхода ошибки.

+0

В основном говорят, что функция, которую вы пытаетесь вызвать с параметрами, которые вы ставите, не существует, но есть версия с разными параметрами. т. е. функция существует, но нет версии, которая соответствует параметрам, которые вы дали. – refi64

+0

Точнее, в нем говорится, что причина в том, что граф, который я передаю в качестве аргумента, не получен из «boost :: adj_list_impl». Однако «boost :: add_vertex (boost :: adj_list_impl)» работает при передаче моего графика, но не «boost :: add_vertex (boost: vertex_property_type &, boost :: adj_list_impl &)» ... – Vulpo

ответ

1

Ravenspoint, вы были правы, я просто неправильно использовал свойства связки.

Вот мой код, который теперь работает :)

#ifndef GRAPH_DEFINITION_H 
#define GRAPH_DEFINITION_H 

#include <boost/graph/adjacency_list.hpp> 
#include "matchedword.h" 

struct VertexProperties { 
public : 
    MatchedWord* matchedWord; 
}; 

struct EdgeProperties 
{ 
    int distance; 
    EdgeProperties() : distance(0) {} 
    EdgeProperties(int d) : distance(d) {} 
}; 

struct GraphProperties { 

}; 

typedef boost::adjacency_list< 
    boost::vecS, boost::vecS, boost::undirectedS, 
    VertexProperties, 
    EdgeProperties, 
    GraphProperties 
> Graph; 

typedef boost::graph_traits<Graph>::vertex_descriptor vertex_t; 
typedef boost::graph_traits<Graph>::edge_descriptor edge_t; 


#endif // GRAPH_DEFINITION_H 

Вызванная функция (возможно, я переделки определение ниже) является:

void GraphManager::addToGraph(VertexProperties node){ 
    vertex_t v = boost::add_vertex(graph); 
    graph[v].matchedWord = node.matchedWord; 
} 

Спасибо за ваши ответы на все!

+0

Если вы ответили на свой вопрос, примите ответ. Если вам понравился ответ ravespoint, примите его. – refi64

3

Легче использовать в комплекте свойства.

Что-то вроде этого:

// A class to hold bundled properties for a vertex 
// In this case, we have a pointer to a MatchedWord object 

class vertex_props { 
public: 
MatchedWord * pMW; 
}; 

Определить тип диаграммы с сгруппированных свойствами

typedef boost::adjacency_list< 
boost::vecS, boost::vecS, boost::undirectedS, 
vertex_props, 
... 
> Graph_t; 

Теперь вы можете добавить вершину с заданными сгруппированных свойствами, как этот

void GraphManager::addToGraph(MatchedWord * node){ 
    graph[ boost::add_vertex(graph) ].pMW = node; 
    ... 
+0

С matchedWord * в комплекте с VertexProperties: boost :: add_vertex (graph) .matchedWord = node; не работает, поскольку add_vertex возвращает vertex_descriptor. Поэтому я попытался: vertex_t v = boost :: add_vertex (график); graph [v] .matchedWord = node; Но это все еще не работает: "boost :: adjency_list <...> :: vertex_bundle не имеет имени с именем matchedWord"! ?? (он есть) – Vulpo

+0

Не уверен, не видя свой код, но похоже, что вы не определили свой тип графика, чтобы использовать связанные свойства. Отправьте свой код. – ravenspoint

Смежные вопросы