2015-08-14 25 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' ... –