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