3

我需要覆盖boost::signals2::signalboost::function之间的连接。 为此,我创建了下面的模板功能:C++模板参数扣除不起作用

template<typename T> 
void bind(boost::signals2::signal<T> &signal, boost::function<T> function) { 
    // override code ... 
} 

我想利用这个bind的那样简单,因为它可以。 从我在类似问题的帖子中读到的内容,模板参数应该从函数参数中推导出来。 但在我的情况下,当没有明确的参数它不起作用。

boost::signals2::signal<void()> my_signal; 

bind<void()>(my_signal, boost::bind(&A::func, this)); // this works 
bind(my_signal, boost::bind(&A::func, this));   // error: no matching function for call 

我错过了什么吗?是否有任何解决方法可避免显式模板参数?

+3

什么是my_signal声明? – ildjarn 2012-07-06 22:04:56

+0

@ildjarn对不起,我应该把它放在那里。它是'boost :: signals2 :: signal my_signal;' – Maros 2012-07-07 10:09:23

+2

模板参数扣除发生在任何转换之前。第二个电话没有完全匹配。 Boost :: bind提供了一些可以转换为第二个参数的东西,但是这只能在模板参数推导之后发生。因此你需要明确的呼叫。或者你可以使整个第二个参数成为一个模板 – 2012-07-07 10:33:45

回答

1

第二个参数类型不是std::function<T>,而是一些绑定类型,因此编译器无法推导出第二个函数参数为T。你需要告诉编译器“你可以在第二个函数参数中找不到T的类型”。这可以通过将第二个参数设为非推导上下文来完成。

template<typename T> 
void bind(boost::signals2::signal<T> &signal, 
      typename std::common_type<boost::function<T>>::type function) { 
    // override code ... 
}