我正在尝试编写包装增强图形库的程序,以便提供方便的用户界面。我是一个新手,可以提高(和堆栈溢出),但是花了很多时间阅读 加强文档。
我的问题是,无论何时我要获取边缘属性的属性映射,无论是使用捆绑属性还是内部属性,调用边缘属性的get()
函数时都会出错,没有与给定参数匹配的函数原型。对顶点属性进行相同操作时,我没有任何困难。此外,boost文档似乎还表明没有get()
函数用于边缘属性。我认为问题可能出在我的构造函数中,该构造函数旨在从文本文件中读取图形信息:
BGraph::BGraph() // constructor
{
graph; // is this how you would initialize the graph?
//...input and initialization of vertices
//...input of edge information
auto e = add_edge(vertex1, vertex2, graph).first; // add the edge
// this is the internal property version
property_map<Graph, edge_weight_t>::type weightMap = get(edge_weight, graph);
// ^^^^^ error here saying there is no such member
weightMap[e] = inWeight;
//graph[e].weight = inWeight; this is the bundled version // give the edge its weight
}
}
这是包装类的头文件:
#include <boost/config.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/adjacency_iterator.hpp>
#include <boost/graph/dijkstra_shortest_paths.hpp>
#include <boost/graph/kruskal_min_spanning_tree.hpp>
#include <boost/graph/named_function_params.hpp>
#include <boost/graph/properties.hpp>
#include <boost/property_map/property_map.hpp>
#include <boost/graph/graphviz.hpp>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
using namespace boost;
class BGraph
{
public:
struct Edge_Properties // property bundle for edges
{
string name;
int weight = 1;
};
struct Vertex_Properties // property bundle for vertices
{
string name;
int distance;
int pred;
};
// class member functions...
typedef adjacency_list<vecS, vecS, bidirectionalS, // graph type
Vertex_Properties, property<edge_weight_t, int> > Graph;
/*typedef adjacency_list<vecS, vecS, bidirectionalS, // graph type
Vertex_Properties, Edge_Properties> Graph;*/ // this is the bundled version
typedef property_map<Graph, vertex_index_t>::type IdMap;
typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
private:
Graph graph; // the boost graph
}
我在dijkstra_shortest_paths
的功能中遇到类似的问题:
dijkstra_shortest_paths(graph, findVertex(startVertex),
predecessor_map(get(&Vertex_Properties::pred, graph))
.distance_map(get(&Vertex_Properties::distance, graph))
.weight_map(/*get(&Edge_Properties::weight, graph)*/ get(edge_weight, graph)));
get函数的特定错误如下:
没有任何重载函数“ get”的实例与参数列表匹配。参数类型为:
(boost:edge_weight_t, const BGraph::graph)
我觉得这里有一些过于简单的解决方案,但我只是找不到。我正在使用MS Visual Studio 2017和增强版本boost_1_67_0。我认为问题可能与Visual Studio有关,尤其是因为与我的代码几乎相同的代码似乎对其他人也有效。感谢您的帮助。
答案 0 :(得分:0)
似乎您的代码应可用于内部属性。
使用捆绑属性时,需要为PropertyTag
指定property_map
作为指向数据成员的指针,在这种情况下,指向weight
的{{1}}成员的指针。
Edge_properties
Here是从捆绑属性中获取属性映射的示例。您可以轻松地使它们适应您的需求。