3

我需要覆蓋boost::signals2::signalboost::function之間的連接。 爲此,我創建了下面的模板功能:C++模板參數扣除不起作用

template<typename T> 
void bind(boost::signals2::signal<T> &signal, boost::function<T> function) { 
    // override code ... 
} 

我想利用這個bind的那樣簡單,因爲它可以。 從我在類似問題的帖子中讀到的內容,模板參數應該從函數參數中推導出來。 但在我的情況下,當沒有明確的參數它不起作用。

boost::signals2::signal<void()> my_signal; 

bind<void()>(my_signal, boost::bind(&A::func, this)); // this works 
bind(my_signal, boost::bind(&A::func, this));   // error: no matching function for call 

我錯過了什麼嗎?是否有任何解決方法可避免顯式模板參數?

+3

什麼是my_signal聲明? – ildjarn 2012-07-06 22:04:56

+0

@ildjarn對不起,我應該把它放在那裏。它是'boost :: signals2 :: signal my_signal;' – Maros 2012-07-07 10:09:23

+2

模板參數扣除發生在任何轉換之前。第二個電話沒有完全匹配。 Boost :: bind提供了一些可以轉換爲第二個參數的東西,但是這隻能在模板參數推導之後發生。因此你需要明確的呼叫。或者你可以使整個第二個參數成爲一個模板 – 2012-07-07 10:33:45

回答

1

第二個參數類型不是std::function<T>,而是一些綁定類型,因此編譯器無法推導出第二個函數參數爲T。你需要告訴編譯器「你可以在第二個函數參數中找不到T的類型」。這可以通過將第二個參數設爲非推導上下文來完成。

template<typename T> 
void bind(boost::signals2::signal<T> &signal, 
      typename std::common_type<boost::function<T>>::type function) { 
    // override code ... 
}