2010-09-06 68 views
3

我嘗試實現一個模板類,它需要一個依賴於模板參數的信號成員。我的第一個想法就是去實現它類似如下:如何使用boost模板相關信號成員實現模板類?

的那類應使用類似:

class SignaledClass 
{ 
public: 
    SignaledClass(void) 
    { 
     SignalClass<int> var1(boost::bind(&SignaledClass::ReceiveINT, this)); 
     SignalClass<double> var2(boost::bind(&SignaledClass::ReceiveDOUBLE, this)); 
    } 

    void ReceiveINT(int &_val) 
    { 
     ... 
    } 

    void ReceiveDOUBLE(double &_val) 
    { 
     ... 
    } 
} 

(順便說一句:我知道,這是沒有意義的只是創建SignalClass對象這只是爲了理解我的問題。)

對於我來說,使用模板作爲信號參數來實現類似委託的概念非常重要。

問題是構造函數代碼不起作用。

但我找到了一個解決方案。

如果我另外指定其他typedef

typedef typename OnReceive::slot_type slot_type; 

,並使用該構造函數的參數,如

PushInputSlot(const slot_type& _slot); 

了它的工作原理。 但我沒有真正的線索爲什麼。

我希望有人能幫助我。

感謝名單, 弗蘭克

P.S:我在計算器這就是爲什麼我不熟悉這裏的規則,新的。希望我在正確的方式做了一切...; - )....

+0

它看起來像你在路上很好......只是在這裏和那裏缺少一個'typename' ......但爲什麼你想要把'boost :: signal'類包裝進去,而不是直接在'SignaledClass'中使用它' ? – Potatoswatter 2010-09-06 20:00:49

回答

2

這是爲什麼構造函數的參數或額外的typedef添加typename(無論是直接的原因)的工作原理:

首先,類型OnReceive是所謂的「依賴類型」,因爲它取決於模板參數的類型。

然後,模板在編譯器中分兩個階段進行處理:第一階段是編譯器遇到模板的源文本,第二階段是模板實際實例化時。 在處理的第一階段,編譯器將(應該)儘可能地驗證模板定義是否正確,但是當涉及到依賴類型時,它會遇到問題。由於依賴類型取決於模板參數,因此編譯器不知道實際類型的外觀。
特別是,在使用::運算符訪問成員時,編譯器需要一些幫助來決定成員是否需要引用成員類型(typedef或嵌套類)或非類型成員(變量,枚舉,等等。)。這可以通過在(完整)類型名稱前添加typename來解決,如果您知道它應該引用某個類型。
編譯器可能存在問題的另一個地方是在成員模板和非模板成員之間進行差異比較。這可以通過在成員模板的名稱(緊接着運營商之後)之前添加關鍵字template來解決。

+0

感謝這些信息。這是一個完美的答案。 – user440773 2010-09-08 11:49:54