通常在C++中,当我需要类之间的依赖关系时,我在头文件中使用前向声明,然后在每个cpp文件中包含两个头文件。如何在C++中声明/定义相互依赖的模板?
但是,使用模板时此方法会中断。因为模板必须完全位于头文件中(不包括我将代码放入cpp并为每个支持的T
枚举template class A<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
}
};
如果我开始在RunA()
做一些B
,我想,我会得到一个“失踪定义”错误,因为B的只能向前声明可以通过RunA()
编译的时间。
也许有一些技巧来组织头文件例如通过将每个头分成类定义和方法定义文件,然后以某种奇特的方式包含它们。或者也许可以通过第三/第四课来完成。但我无法想象如何专门做到这一点。
C++ 11/14/17都可以(特别是,它是MSVC++ 2017,工具集v141)。
由于VS15能够安装3个不同的编译器版本(以前所有版本都只有一个版本),因此请列出版本的年份,而不是列出编译器的年份。 – tambre
@SergeyB。,这解决了我给出的代码示例的特定问题。但是,我想要一个像“不需要.h和.cpp文件一样的通用指南,需要第三种文件类型的模板,如.inl,它将包含函数定义”,然后解释如何管理include。 ... –
大概就可以使部件的制造方法的功能模板,并通过'static_assert'喜欢强制类型:'模板<模板类C> 空隙RUNA(C * PB { static_assert(标准:: is_same ,B > :: value,“!”); // ... }'。这样你只需要在调用点为'B'定义。它可以为你工作吗? –
skypjack