通常在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