将模板函数绑定到 gtkmm 信号时出现编译错误
compilation error with binding a template function to a gtkmm signal
我有一些回调函数:
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 ) );
谁能告诉我我搞砸了什么?
当您使用 &someclass::someCB2
时,编译器没有机会推断出 T
与 mem_fun()
一起使用时应该是什么类型。如果 class 的地址直接与允许推断模板参数的东西一起使用,它将起作用。
在你的情况下,你可能想使用类似下面的东西:
static_cast<bool (someclass::*)(GdkEventFocus*, GtkEntry*)>(&someclass::someCB2)
或者你也可以直接指定模板参数:
&someclass::someCB2<GtkEntry>
我有一些回调函数:
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 ) );
谁能告诉我我搞砸了什么?
当您使用 &someclass::someCB2
时,编译器没有机会推断出 T
与 mem_fun()
一起使用时应该是什么类型。如果 class 的地址直接与允许推断模板参数的东西一起使用,它将起作用。
在你的情况下,你可能想使用类似下面的东西:
static_cast<bool (someclass::*)(GdkEventFocus*, GtkEntry*)>(&someclass::someCB2)
或者你也可以直接指定模板参数:
&someclass::someCB2<GtkEntry>