我有一些回調函數:編譯錯誤與模板的功能結合到一個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));
有人可以告訴我我搞砸了嗎?
你有完全一樣的問題,因爲[他](http://stackoverflow.com/questions/32016749/forwarding-arguments-to-template-member-function)(儘管它是一個不同的用法),你可以通過明確地告訴編譯器你想使用哪個'someCB2'來解決這個問題(我的意思是,哪種類型)[編輯:另外,我有你想要的感覺使用模板來實現動態多態,這將無法正常工作,使用虛擬方法] – Caninonos
@Caninonos actualy我不明白我怎麼能告訴這種類型選擇(我所有的嘗試失敗) –
@Caninonos thx爲您的參與 –