如何在类B中前置声明类A里using定义的m_graph类型
问题描述
我写了这段代码:
class m_VertexProps; class m_EdgeProps; class m_GraphProps; using m_graph = boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS,// Vertex Properties... m_VertexProps, // Edge Propereties... m_EdgeProps, // Graph Properties m_GraphProps>; class A{ public: A(); m_graph g; };
现在想在类B的头文件里前置声明m_graph,不想包含类A的头文件,只在.cpp文件中包含。试了class m_graph;这种方式,但没用:
class m_graph; class B{ public: B(); };
请问怎么正确前置声明m_graph?
解决方案
直接写class m_graph;行不通,因为m_graph不是类,而是boost::adjacency_list模板实例的typedef别名,C++不支持直接前置声明typedef出来的别名。
要实现你的需求,得按以下步骤来:
- 先前置声明
m_VertexProps、m_EdgeProps、m_GraphProps这三个类——毕竟m_graph的定义依赖它们; - 前置声明boost命名空间下的
adjacency_list模板; - 重新typedef出
m_graph这个别名。
具体到代码,类B的头文件可以这么写:
// 前置声明依赖的三个类 class m_VertexProps; class m_EdgeProps; class m_GraphProps; // 前置声明boost的adjacency_list模板 namespace boost { template <typename OutEdgeListS, typename VertexListS, typename DirectedS, typename VertexProp, typename EdgeProp, typename GraphProp> class adjacency_list; } // 重新定义m_graph的typedef别名 using m_graph = boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, m_VertexProps, m_EdgeProps, m_GraphProps>; class B{ public: B(); // 注意:这里只能用m_graph的指针或引用,不能直接定义对象 // 要是定义对象,编译器还是需要m_graph的完整定义,得包含对应头文件 m_graph* graph_ptr; m_graph& graph_ref; };
这么做的核心是:C++允许前置声明模板,结合前置声明的依赖类,就能重新typedef出和原代码一致的m_graph别名。但要注意,在这个头文件里,你只能用m_graph的指针或引用,不能直接声明m_graph类型的成员变量——否则编译器需要知道m_graph的完整结构,还是得包含相关头文件。
内容的提问来源于stack exchange,提问作者Annu_the_coder
相关产品推荐
相关产品推荐

