2
通常,如果我的#include鏈變得循環,我通過用一個前向聲明替換一個#includes來解決它,然後將所有依賴此類型的函數實現移動到cpp文件中,其中我將#include頭。C++如何處理循環依賴?
但是 - 在某些情況下,將函數實現放入cpp文件很不好 - 特別是在處理模板或內聯函數時。
因此 - 是否有其他方法來處理循環#include鏈而不是使用前向聲明?
謝謝!
通常,如果我的#include鏈變得循環,我通過用一個前向聲明替換一個#includes來解決它,然後將所有依賴此類型的函數實現移動到cpp文件中,其中我將#include頭。C++如何處理循環依賴?
但是 - 在某些情況下,將函數實現放入cpp文件很不好 - 特別是在處理模板或內聯函數時。
因此 - 是否有其他方法來處理循環#include鏈而不是使用前向聲明?
謝謝!
您應該限制這種循環依賴關係,因爲它們使代碼難以理解並難以使用。
也就是說,有時候這樣的依賴是必要的。在這些情況下,您可以在一個頭文件中聲明所有實體,然後在之後,所有聲明都爲任何函數模板和內聯函數提供了定義。例如:
#ifndef MY_AWESOME_INCLUDE_GUARD
#define MY_AWESOME_INCLUDE_GUARD
template <typename> struct B;
template <typename T>
struct A
{
template <typename U>
void f(B<U>);
};
template <typename T>
struct B
{
template <typename U>
void f(A<U>);
};
template <typename T>
template <typename U>
void A<T>::f(B<U>) { }
template <typename T>
template <typename U>
void B<T>::f(A<U>) { }
#endif
你能給我們一個例子嗎?我很難完全理解你的意思 – Earlz 2010-10-24 01:59:03
你可以轉發聲明模板就好了。 – 2010-10-24 02:13:48