【发布时间】:2017-10-16 21:32:19
【问题描述】:
我有一个带有以下声明的 A 类(A.h 文件):
#ifndef __A_DEFINED__
#define __A_DEFINED__
class A
{
public:
template<typename T> inline void doThat() const;
};
#endif
以及从该类派生的 B 类(B.h 文件):
#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::doThat() 使用 B::doThis():
template<typename T> inline void A::doThat() const { B b; b.doThis(); }
通常,循环依赖不会成为问题,因为我只需在 .cpp 文件中定义 A::doThat()。然而,就我而言,doThat 是一个模板函数,所以我不能这样做。
以下是我目前设想的解决方案:
在 .cpp 文件中定义模板函数
A::doThat()。问题是我需要使用各种模板参数显式实例化所有调用(实际情况下可能有很多)。在A.h中声明A类后,添加
#include "B.h",然后定义A::doThat()函数。这在 Visual Studio 中运行良好,但 g++ 不喜欢它。
有没有巧妙的方法来解决这个问题?
编辑: 在实际情况下,不只有一个子类 B,而是多个(B、C、D 等)函数 A::doThat() 依赖于所有他们。函数 B::doThis() 也是模板化的。
【问题讨论】:
-
不相关:任何连续有两个下划线的标识符都保留给实现使用。使用它们需要您自担风险。更多信息在这里:What are the rules about using an underscore in a C++ identifier?
标签: c++ templates dependencies circular-dependency