Mat*_*Mat 2 c++ circular-dependency include
通常,如果我的#include链变为循环,我通过用前向声明替换#includes中的一个来解决它,然后将依赖于此类型的所有函数实现移动到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
Run Code Online (Sandbox Code Playgroud)