クラス テンプレート間の相互依存関係を解決するソリューションがあります。しかし、それを検討する前に、私は通常、「切り離すべきではないか」と自問する必要があります。確かに、それは悪い設計である可能性があります。ただし、モデルの一部である場合もあります。あなたのケース、グラフは一例です。
このソリューションは、概念レベルでのデカップリングに基づいており、両方のタイプ (頂点とエッジ) を埋め込んで認識し、ループを解消する中間テンプレート タイプを導入します。
template <typename T_graph, typename T_label>
struct vertex_tmpl {
typedef typename T_graph::edge_t edge_t;
edge_t* edge;
// .... maybe some more edges ....
};
template <typename T_graph, typename T_weight>
struct edge_tmpl {
typedef typename T_graph::vertex_t vertex_t;
vertex_t* vertex;
};
template < template <typename, typename> class T_vertex,
template <typename, typename> class T_edge,
typename T_weight = int,
typename T_label = int >
struct graph_tmpl {
typedef graph_tmpl< T_vertex, T_edge> self_t;
typedef T_vertex<self_t, T_label> vertex_t;
typedef T_edge<self_t, T_weight> edge_t;
};
int main() {
typedef graph_tmpl< vertex_tmpl, edge_tmpl> graph_t;
typedef typename graph_t::edge_t basic_edge;
typedef typename graph_t::vertex_t basic_vertex;
basic_edge edge;
basic_vertex vertex;
vertex.edge = &edge;
edge.vertex = &vertex;
}
http://ideone.com/FrBqcb
高度な C++ テクニックに関する非常に優れたレクチャー ノートで、ソリューションの詳細な説明を見つけることができます。