1

我正在尝试 boost::graph 头库,但我仍然无法向我的图表添加垂直。

这是我使用 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

任何想法 ?谢谢。

错误:没有匹配函数调用'add_vertex(MatchedWord*&, Graph&)' 候选者是:[...] 模板类型名 Config::vertex_descriptor boost::add_vertex(const typename Config::vertex_property_type&, boost::adj_list_impl&)

注意:模板参数扣除/替换失败:

注意:'Graph {aka boost::adjacency_list, boost::property, boost::property >}'不是从 'boost::adj_list_impl' 派生的

我不明白这个错误输出的含义。

4

2 回答 2

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;
   ...
于 2013-07-12T14:23:15.673 回答
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;
}

谢谢大家的回答!

于 2013-07-14T08:36:01.700 回答