有一种解决方案可以解决类模板之间的相互依赖关系。但在考虑之前,我通常会问自己:“我不应该解耦吗?” 事实上,这可能是一个糟糕的设计。但有时,它是模型的一部分。你的情况,图表,就是一个例子。
该解决方案基于概念级别的解耦,并引入一个中间模板类型,该类型将嵌入并了解两种类型(顶点和边)a 并打破循环。
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++ 技术的非常好的讲义中找到对解决方案的广泛解释。