将模板函数绑定到 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 时,编译器没有机会推断出 Tmem_fun() 一起使用时应该是什么类型。如果 class 的地址直接与允许推断模板参数的东西一起使用,它将起作用。

在你的情况下,你可能想使用类似下面的东西:

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

或者你也可以直接指定模板参数:

&someclass::someCB2<GtkEntry>