2015-08-14 62 views
0

我有一些回調函數:編譯錯誤與模板的功能結合到一個gtkmm的信號

class someclass 
{ 
    private: 
    bool someCB1(GdkEventFocus*,GtkEntry*); 
    template<class T> bool someCB2(GdkEventFocus*,T*); 
}; 

someclass代碼的地方我有一個Gtk::Entry* entry。如果我連someCB1

entry->signal_focus_out_event().connect(sigc::bind<Gtk::Entry*>(sigc::mem_fun(this, &someclass::someCB1), entry)); 

這一個工程,但在我的情況下,我想用someCB與不同種類的Gtk::Widget,所以我寫的模板函數someCB2

連接someCB2我寫道:

entry->signal_focus_out_event().connect(sigc::bind<Gtk::Entry*>(sigc::mem_fun(this, &someclass::someCB2), entry)); 

這條線在編譯失敗,錯誤非常多(我不能將控制檯滾動到第一個,但最後一個是類似的,所以我想其餘的一樣)。這裏最後一個:

/usr/include/sigc++-2.0/sigc++/functors/mem_fun.h:6356:1: note: template argument deduction/substitution failed: 
/home/user/chicken.cc:158:111: note: couldn't deduce template parameter ‘T_arg1’ 
    entry->signal_focus_out_event().connect(sigc::bind<Gtk::Entry*>(sigc::mem_fun(this, &someclass::someCB2), entry)); 

有人可以告訴我我搞砸了嗎?

+1

你有完全一樣的問題,因爲[他](http://stackoverflow.com/questions/32016749/forwarding-arguments-to-template-member-function)(儘管它是一個不同的用法),你可以通過明確地告訴編譯器你想使用哪個'someCB2'來解決這個問題(我的意思是,哪種類型)[編輯:另外,我有你想要的感覺使用模板來實現動態多態,這將無法正常工作,使用虛擬方法] – Caninonos

+0

@Caninonos actualy我不明白我怎麼能告訴這種類型選擇(我所有的嘗試失敗) –

+0

@Caninonos thx爲您的參與 –

回答

2

當您使用&someclass::someCB2編譯器沒有機會推斷出Tmem_fun()一起使用時應該是什麼類型。如果該類的地址直接與允許推斷模板參數的某個東西一起使用,它將起作用。

你的情況,你可能想使用類似下面來代替:

static_cast<bool (someclass::*)(GdkEventFocus*, GtkEntry*)>(&someclass::someCB2) 

另外,您也可以直接指定模板參數:

&someclass::someCB2<GtkEntry> 
+0

啊,太慢了,我不應該做其他的事情:p至少:[例子](http://ideone.com/5HTimW)(帶有虛擬信號/插槽,沒有封裝,因爲我很懶,也不是相關在這裏) – Caninonos

+0

@DietmarKühl謝謝你。當我閱讀'&someclass :: someCB2 ''當然是......我叫'esel' ...我不會經常寫模板,我忘記了''的地方'我試過把它加入之前'someclass'和'someCB2' ... –