2013-02-05 45 views
0

我正在研究C++中的API,並試圖/真的/很難不使用RTTI(運行時類型信息)來實現一些依賴注入功能。編譯器模板實現是否引入循環依賴?

我相信我能做到這一點,但通過利用模板 - 但它讓我疑惑:

當模板「擴大」和由編譯器實現,做他們實際上引入循環依賴,(編譯時間還是運行時間),模板類在框架庫中實現,並且該類的客戶端位於上層分層庫中?

感謝您的幫助!

#include <string> 

/************************************************************/ 
// Implemented in Framework.lib 
namespace Framework 
{ 
    template<typename ShapeTemplateType> 
    class Utility 
    {   
     void Do() 
     { 
      ShapeTemplateType x; 
      (void) x; 
     } 
    }; 
} // End namespace Framework 

/************************************************************/ 
// Implemented in Application.lib 
namespace Application 
{ 
    class StateObject 
    { 
     int i; 
    }; 

    class Facade 
    { 
     Framework::Utility<StateObject> state; 
    }; 
} // End Namespace Application 


/********************************************************************/ 
// Implemented in Client 
int main(int args, char* argv[]) 
{ 
    Application::Facade facade; 

    //Derived d; 
    return 0; 
} 
+0

看起來好像不是這樣。你有什麼錯誤嗎? – imreal

+0

這段代碼應該做什麼? – Pubby

+0

你的模板是什麼意思是「在Framework.lib中實現的」? '模板'往往是(禁止一些花哨的舞蹈)是一個純粹的頭文件構造。它們以什麼方式在特定的lib中「實現」? – Yakk

回答

3

該模板的代碼是在實例化的編譯單元中生成的。在您的示例中,生成的機器碼將位於Application.lib中。

+0

根據你的回答,爲了確定我很清楚,即使沒有物理分層,並且只有一個生成的編譯單元,生成的編譯單元中的代碼將依賴於調用代碼,反之亦然,對?雖然在生成的編譯單元中仍然存在循環依賴關係... –

+0

也許你可能會這樣說,但爲什麼會這麼重要?通常編譯單元是您必須擔心循環依賴性的級別。一個編譯單元中的任何內容都不會引起關注,因爲它不會引起任何問題。 –

+0

我在生成循環依賴時遇到了問題,最終導致了堆棧溢出。MS Nov 2012 C++編譯器有一個新的Variadic Template支持錯誤,我花了一段時間才縮小到編譯器問題的範圍。謝謝! –

0

你的意思是像一個圓形模板依賴:

template<class T> 
using A = B<T>; 

template<class T> 
using B = A<T>; 

int main() 
{ 
    A<int>; 
} 

這種失敗在A的聲明,因爲B是不可用的,如果你FWD聲明它,它抱怨它的不完整的。

我不認爲它有可能在模板中具有循環依賴性,因爲必須爲每個用於實例化的模板參數提供完整類型。鑑於此,模板實例化鏈因此必須是非循環的。