我有以下声明一个类A(阿文件):与模板函数循环依赖
#ifndef __A_DEFINED__
#define __A_DEFINED__
class A
{
public:
template<typename T> inline void doThat() const;
};
#endif
和B类从该类(BH文件)推导出:
#ifndef __B_DEFINED__
#define __B_DEFINED__
#include <iostream>
#include "A.h"
class B : public A
{
public:
void doThis() const { std::cout << "do this!" << std::endl; }
};
#endif
所以远,那么好。我的问题是,函数A ::找时间做()使用B :: doThis():在
template<typename T> inline void A::doThat() const { B b; b.doThis(); }
一般情况下,循环依赖不会是一个问题,因为我也只是定义了A ::找时间做() .cpp文件。但在我的情况下,doThat是一个模板函数,所以我不能这样做。
这里是我到目前为止所设想的解决方案:
定义模板功能
A::doThat()
在.cpp文件。与此相关的问题是,我需要显式实例化具有各种模板参数的所有调用(实际情况中可能有很多)。在A.h中声明A类后,添加
#include "B.h"
,然后定义A::doThat()
函数。这在Visual Studio中运行良好,但是g ++不喜欢它。
有没有一种简洁的方法来解决这个问题?在真实情况下,不仅有一个孩子类B,而且有几个(B,C,D等)。函数A :: doThat()取决于它们中的所有孩子。函数B :: doThis()也是模板化的。
无关:任何在一行中有两个下划线的标识符都被保留供实现使用。使用它们需要您自担风险。更多信息在这里:[有关在C++标识符中使用下划线的规则是什么?](https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in- ac-identifier) – user4581301