Hi,
I've used BGL before for representing graphs, but this is my first time with
an algorithm. I've been stuck for many hours trying to define a property map
with bundled properties, I'd really appreciate some help. I'm using gcc4.3,
boost 1.34. An example program and the compiler error are:
-------------------------------------------------------------
#include
#include
#include
using namespace std;
class Point {
public:
double p_[2];
};
struct EdgeProp {
double cost;
};
typedef boost::adjacency_list Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor VertexRef;
class AStarHeuristic : public boost::astar_heuristic
{
public:
double operator()( VertexRef vertex ) const {return 0.0;}
};
// exception for termination
struct FoundGoal {};
//
// A* Visitor that terminates when we reach the goal
//
class AStarVisitor : public boost::default_astar_visitor
{
public:
AStarVisitor( const VertexRef &goal )
: goal_(goal) {}
template <class Graph>
void examine_vertex( VertexRef vertex, Graph &g )
{
if( vertex == goal_ )
throw FoundGoal();
}
private:
VertexRef goal_;
};
bool
searchThroughGraph( const Graph &graph,
VertexRef start,
VertexRef goal,
std::vector<VertexRef> &shortestPath )
{
AStarHeuristic aStarHeuristic;
AStarVisitor aStarVisitor( goal );
typedef boost::property_map::type
EdgeWeightMap;
EdgeWeightMap edgeWeightMap = get(&EdgeProp::cost, graph);
std::vector<VertexRef> predecessors(num_vertices(graph));
try {
astar_search( graph,
start,
aStarHeuristic,
boost::weight_map(edgeWeightMap).
predecessor_map(&predecessors[0]).
visitor(aStarVisitor) );
}
catch ( const FoundGoal& )
{
shortestPath.clear();
for ( VertexRef vertex = goal;; vertex = predecessors[vertex] )
{
shortestPath.push_back( vertex );
if ( predecessors[vertex]==vertex ) break;
}
std::reverse( shortestPath.begin(), shortestPath.end() );
return true;
}
// If we get to here, we couldn't reach the goal
return false;
}
int main()
{
Graph graph;
std::vector<VertexRef> path;
searchThroughGraph(graph,0,1,path);
return 0;
}
-------------------------------------------------------------
/home/a.brooks/shh/src/libs/prm/test/stupid.cpp: In function ‘bool
searchThroughGraph(const Graph&, VertexRef, VertexRef, std::vector&)’:
/home/a.brooks/shh/src/libs/prm/test/stupid.cpp:64: error: conversion
from ‘boost::bundle_property_map, boost::detail::edge_desc_impl, EdgeProp, const double>’ to non-scalar type ‘searchThroughGraph(const
Graph&, VertexRef, VertexRef, std::vector&)::EdgeWeightMap’ requested
-------------------------------------------------------------
Does anyone know what might be wrong?
More generally, I'm a bit mystefied by the "::type"
syntax -- can anyone give me any pointers about what this syntax means, or
where I can look it up? (googling for colon-colon-star doesn't help much).
I also tried pattern-matching from the documentation page about bundled
properties (the weight_map(get(&Highway::miles, map)) example) but couldn't
get this to compile either. Is this example correct?
Thanks very much in advance,
Alex