在一些情况下我们先定义类A,再定义类B(这样的定义顺序是因为类B有个成员函数返回类型A(而不是A的引用或指针)),但是在类A中有一个数据成员的类型是类B的引用,此时便需要在类A的定义前先申明B
// 申明模板类Graph
template <typename BatchSetType>
class Graph;
// 定义模板类BlockCutTree
template <typename BatchSetType>
class BlockCutTree
{
friend Graph<BatchSetType>; // 友元模板类Graph
const Graph<BatchSetType> &g; // 模板类Graph的引用类型
public:
BlockCutTree(const Graph<BatchSetType> &g):g(g){}
};
// 定义模板类Graph
template <typename BatchSetType>
class Graph
{
public:
BlockCutTree<BatchSetType> func(); // 返回模板类BlockCutTree类型的参数
};