【问题标题】:compilation error with binding a template function to a gtkmm signal将模板函数绑定到 gtkmm 信号时出现编译错误
【发布时间】:2015-08-14 22:13:59
【问题描述】:

我有一些回调函数:

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 ) );

谁能告诉我我搞砸了什么?

【问题讨论】:

  • 你有与him 完全相同的问题(尽管它的用法不同)你可以通过明确告诉编译器你想使用哪个someCB2 来解决这个问题(我的意思是,使用哪种类型) [编辑:另外,我感觉您正在尝试使用模板来实现动态多态性,这是行不通的,为此使用虚拟方法]
  • @Caninonos 实际上我不知道如何判断要选择哪种类型(我所有的尝试都失败了)
  • @Caninonos 感谢您的参与

标签: c++ templates binding g++ gtkmm


【解决方案1】:

当你使用&amp;someclass::someCB2 时,编译器没有机会推断出Tmem_fun() 一起使用时应该是什么类型。如果类的地址直接与允许推断模板参数的东西一起使用,它将起作用。

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

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

您也可以直接指定模板参数:

&someclass::someCB2<GtkEntry>

【讨论】:

  • 啊,太慢了,我不应该做其他事情 :p 至少:example (带有虚拟信号/插槽,没有封装,因为我很懒,在这里不相关)
  • @Dietmar Kühl 谢谢。实际上,当我阅读&amp;someclass::someCB2&lt;GtkEntry&gt; 时,我当然...叫我esel...我不经常写模板,我忘记了&lt;GtkEntry&gt; 的位置,我尝试在someclass 之前添加它并且someCB2...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
相关资源
最近更新 更多