通常,如果我的#include 链变得循环,我通过用前向声明替换其中一个#include 来解决它,然后将所有依赖于这种类型的函数实现移动到cpp 文件中,我在其中#include 头文件。
但是 - 在某些情况下,将函数实现放入 cpp 文件是不好的 - 特别是在处理模板或内联函数时。
因此 - 是否有其他方法来处理循环#include 链而不是使用前向声明?
谢谢!
通常,如果我的#include 链变得循环,我通过用前向声明替换其中一个#include 来解决它,然后将所有依赖于这种类型的函数实现移动到cpp 文件中,我在其中#include 头文件。
但是 - 在某些情况下,将函数实现放入 cpp 文件是不好的 - 特别是在处理模板或内联函数时。
因此 - 是否有其他方法来处理循环#include 链而不是使用前向声明?
谢谢!
您应该限制这种循环依赖,因为它们使代码难以理解且难以使用。
也就是说,有时这种依赖关系是必要的。在这些情况下,您可以在单个头文件中声明所有实体,然后在所有声明之后为任何函数模板和内联函数提供定义。例如:
#ifndef MY_AWESOME_INCLUDE_GUARD
#define MY_AWESOME_INCLUDE_GUARD
template <typename> struct B;
template <typename T>
struct A
{
template <typename U>
void f(B<U>);
};
template <typename T>
struct B
{
template <typename U>
void f(A<U>);
};
template <typename T>
template <typename U>
void A<T>::f(B<U>) { }
template <typename T>
template <typename U>
void B<T>::f(A<U>) { }
#endif