仅标头循环依赖项 我在C++的头库中遇到循环依赖性问题,在使用源文件而不是只做所有报头时,不会出现循环依赖问题。 情况是这样的:

仅标头循环依赖项 我在C++的头库中遇到循环依赖性问题,在使用源文件而不是只做所有报头时,不会出现循环依赖问题。 情况是这样的:,c++,circular-dependency,header-only,C++,Circular Dependency,Header Only,两个类A和B有四个文件。每个类都有其头文件(例如“A.hpp”)及其实现文件(例如“A.tpp”) 依赖项如下所示: A的标题需要B的标题 A的impl需要B的头 B的标题只需要向a转发声明 B的impl需要A的标题 因此,在基于源代码的库中,按照源文件包含和编译的顺序,一切都会很好: 水电站 A.hpp A.tpp或B.tpp(此处的顺序不重要) 我的文件的结构如下: A.hpp的文件内容: A.tpp的文件内容: B.hpp的文件内容: B.tpp的文件内容: 因此,我的问题是:是否

两个类A和B有四个文件。每个类都有其头文件(例如“A.hpp”)及其实现文件(例如“A.tpp”)

依赖项如下所示:
  • A的标题需要B的标题
  • A的impl需要B的头
  • B的标题只需要向a转发声明
  • B的impl需要A的标题
因此,在基于源代码的库中,按照源文件包含和编译的顺序,一切都会很好:

  • 水电站
  • A.hpp
  • A.tpp或B.tpp(此处的顺序不重要)
我的文件的结构如下:

A.hpp的文件内容: A.tpp的文件内容: B.hpp的文件内容: B.tpp的文件内容:
因此,我的问题是:是否有一种解决方案可以打破这种不必要的循环依赖关系,这种依赖关系只发生在我的库使用了一个只包含标题的解决方案的情况下?

从不
#包含
实现文件。在
B.hpp
中,您需要
#在
class B`定义之后包含“A.hpp”。@twentylemon我认为它是模板循环依赖关系与类的内容相关。很难就如何打破它提出建议,也不知道有什么限制以及为什么这种定义事物的方式会困扰你。它的结构很奇怪
A.tpp
应该只包含
A.hpp
——让标题包含它需要的所有文件。另外,
#不包括“A.hpp”#不包括“A.tpp”
中断吗
A.tpp
需要它自己的头部防护装置。
A.tpp
是否需要包含任何内容?为什么不像通常的做法那样在头文件中实现模板函数呢?找到这篇文章-最后一句话:“请记住,在hpp文件中包含ipp文件几乎总是错误的。”我基本上是这样做的,现在我知道了为什么这是一个可怕的错误。我想我必须改变我整个项目的总体结构。。。谢谢你的回答!
#ifndef A_H
#define A_H
#include "B.hpp"
class A { ... };
#include "A.tpp"
#endif
#ifndef A_H
    #error "Do not include this file directly."
#endif
// ... some implementations for A.hpp
#ifndef B_H
#define B_H
class A;
class B { ... };
#include "B.tpp"
#endif
#include "A.hpp"
#ifndef B_H
    #error "Do not include this file directly."
#endif
// ... some implementations for B.hpp