我有以下聲明一個類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