gpt4 book ai didi

c++ - 如何打破定义嵌套模板类的 header 的循环依赖?

转载 作者:行者123 更新时间:2023-11-28 05:06:09 25 4
gpt4 key购买 nike

编辑:链接的那个没有解决这个特殊情况,因为在我的情况下有一个嵌套类型。

让我们想象一下情况是这样的:

//foo.hpp
//include guards

template <typename T>
class foo
{
class bar;
};

bar 的代码太大,所以我想(不是真的,但没关系)到另一个文件。

那么,目前的情况是这样的:

//foo.hpp
#include <bar.hpp>
//include guards

template <typename T>
class foo
{
class bar;
};

//bar.hpp
#include <foo.hpp>
//include guards

template <typename T>
class foo::bar
{
//...
}

这肯定是循环依赖。但问题是编译器(clang 和 gcc)接受它。

我应该修复它还是没有什么可修复的?如果是错误,我应该如何修复它?我是否应该将所有内容都转储到一个文件中,然后收工?

实际上,bar 是一个迭代器,我不想让它独立。

那里有 include 守卫,所以我想这就是阻止它被多次包含的原因,但循环依赖仍然让我担心。

最佳答案

嗯,一开始,你不能在没有 foo 的情况下使用 bar,当然...但是你想从 foo 的标题中删除它。那么这个呢:

foo.hpp:

//include guards

// no, we won't include bar.hpp here...

template <typename T>
class foo
{
class bar;
};

// foo::bar is now predeclared

// and now we include bar:
#include "bar.hpp"

bar.hpp 不打算直接包含,所以我们只保留 foo 的包含:

//include guards    

// don't need it:
//#include "foo.hpp"


template <typename T>
class foo::bar
{
//...
};

包含 foo 的任何人也将包含 bar。为了更清楚地表示 bar 不打算直接包含在内,我建议将其移动到具有适当名称的其他文件夹中,例如。 G。 “私有(private)”。

不幸的是,我们可能会在 bar.hpp 中失去对 foo 的 IDE 支持。实际上,我们可以通过在 bar.hpp 中包含 foo.hpp 来简单地取回它。

但为什么 - 然后我们又有一个循环包含???

嗯,是的,我们有,但是圆圈被打破了!请记住,bar.hpp 包含在 foo 的声明之后!与普通的循环包含相比,这是这里的最大区别。那么从编译器的角度来看,会发生什么:

  • foo.hpp 包含在某处,foo 被声明,bar.hpp 随后被添加。
  • 再次包含 foo.hpp,但定义了包含守卫,圆圈被打破。

从 IDE 来看恰恰相反:* bar.hpp 包括 foo.hpp* foo.hpp 再次包含 bar.hpp,但守卫已经定义。

所以我们很好......实际上,现在甚至可以包含 bar.hpp 并且仍然会得到 foo。

关于c++ - 如何打破定义嵌套模板类的 header 的循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44726301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com