gpt4 book ai didi

c++ - 如何在 C++ 中声明/定义相互依赖的模板?

转载 作者:行者123 更新时间:2023-11-30 05:10:55 27 4
gpt4 key购买 nike

通常在 C++ 中,当我需要类之间的相互依赖性时,我会在头文件中使用前向声明,然后在每个 cpp 文件中包含两个头文件。

但是,这种方法在使用模板时会失效。因为模板必须完全在头文件中(不包括我将代码放入 cpp 并为每个受支持的 template class A<T>; 枚举 T 的情况 - 这并不总是可行的,例如当 T 是 lambda 时)。

那么有没有办法在 C++ 中声明/定义相互依赖的模板?

代码示例

template<typename T> struct B;
template<typename T> struct A {
void RunA(B<T> *pB) {
// need to do something to B here
}
};

template<typename T> struct B {
void RunB(A<T> *pA) {
// need to do something to A here
}
};

如果我开始对 B 做些什么在RunA() ,我想,我会得到一个“缺少定义”的错误,因为到 RunA() 时只有 B 的前向声明可用。已编译。

也许有一些技巧来组织头文件,例如通过将每个 header 拆分为类定义和方法定义文件,然后以某种奇特的方式包含它们。或者也许可以通过第三/第四类来完成某些事情。但我无法想象具体如何做到这一点。

C++11/14/17 都可以(具体来说,它是 MSVC++2017,工具集 v141)。

最佳答案

您可以使用细粒度的 header :

//  A.forward.hpp
template<typename T> struct A;

// A.decl.hpp
#include "A.forward.hpp"
#include "B.forward.hpp"

template<typename T> struct A
{
void RunA(B<T> *pB);
};

// A.impl.hpp
#include "A.decl.hpp"
#include "B.hpp"

template<typename T> void A< T >::
RunA(B<T> *pB)
{
// need to do something to B here
}

// A.hpp // this one should be included by code using A
#include "A.decl.hpp"
#include "A.impl.hpp"

// B.forward.hpp
template<typename T> struct B;

// B.decl.hpp
#include "B.forward.hpp"
#include "A.forward.hpp"

template<typename T> struct B
{
void RunB(A<T> *pA);
};

// B.impl.hpp
#include "B.decl.hpp"
#include "A.hpp"

template<typename T> void B< T >::
RunB(A<T> *pA)
{
// need to do something to A here
}

// B.hpp // this one should be included by code using B
#include "B.decl.hpp"
#include "B.impl.hpp"

显然,所有这些 header 还需要某种我在这里省略的 header 防护。 重要通知:.impl.hpp header 被认为是内部的,不应被外部代码使用,而 .forward.hpp, .decl.hpp.hpp 可以在任何地方使用。

这种方法确实引入了循环包含依赖关系,但这不会导致问题:通过包含 header 生成的代码结构确保代码部分按以下顺序包含:前向声明、类定义、方法定义。

关于c++ - 如何在 C++ 中声明/定义相互依赖的模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45402913/

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