Использование property<tag, type>
означает , а не связанное свойство¹.
Все эти примеры, о которых вы говорите, будут использовать этот стиль:
typedef boost::adjacency_list<
edge_selector, vertex_selector, boost::bidirectionalS,
VertexProperty, EdgeProperty> adjacency_type;
Примечание у вас edge_selector
и vertex_selector
в обратном порядке.
Конечно, теперь вы не можете объявить форвард. Поэтому вам нужно найти другой способ получить доступ к признакам графа, прежде чем вы определите сам список adjacency_list: '
typedef boost::adjacency_list_traits<edge_selector, vertex_selector, boost::bidirectionalS> traits;
Таким образом, вы можете иметь типы размера заранее:
typedef traits::vertices_size_type size_type;
typedef traits::edges_size_type edges_size_type;
Демо
Live On Coliru
#include <boost/graph/adjacency_list.hpp>
#include <iostream>
struct ArchGraph;
class Graph
{
friend std::ostream& operator<<(std::ostream&, const ArchGraph &);
struct VertexProperty;
struct EdgeProperty;
typedef boost::vecS vertex_selector;
typedef boost::vecS edge_selector;
typedef boost::adjacency_list_traits<edge_selector, vertex_selector, boost::bidirectionalS> traits;
typedef traits::vertices_size_type size_type;
typedef traits::edges_size_type edges_size_type;
struct VertexProperty {
size_type id;
};
struct EdgeProperty {
edges_size_type index;
size_type id;
};
typedef boost::adjacency_list<
edge_selector, vertex_selector, boost::bidirectionalS,
VertexProperty, EdgeProperty> adjacency_type;
public:
Graph() : _adj(3) {
for (auto vd : boost::make_iterator_range(vertices(_adj)))
_adj[vd].id = (vd+1)*10;
}
void foo() const;
private:
adjacency_type _adj;
};
void Graph::foo() const
{
for (auto v : boost::make_iterator_range(boost::vertices(_adj))) {
std::cout << _adj[v].id << " ";
}
}
int main() {
Graph g;
g.foo();
}
печать
10 20 30
¹ (Напротив, это старый стиль, который называется "внутренняя собственность", если я правильно помню)