2

通常,如果我的#include 链变得循环,我通过用前向声明替换其中一个#include 来解决它,然后将所有依赖于这种类型的函数实现移动到cpp 文件中,我在其中#include 头文件。

但是 - 在某些情况下,将函数实现放入 cpp 文件是不好的 - 特别是在处理模板或内联函数时。

因此 - 是否有其他方法来处理循环#include 链而不是使用前向声明?

谢谢!

4

1 回答 1

7

您应该限制这种循环依赖,因为它们使代码难以理解且难以使用。

也就是说,有时这种依赖关系是必要的。在这些情况下,您可以在单个头文件中声明所有实体,然后所有声明之后为任何函数模板和内联函数提供定义。例如:

#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
于 2010-10-24T02:07:30.350 回答