Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板参数演绎不起作用_C++_Templates_Template Argument Deduction_Boost Function_Boost Signals2 - Fatal编程技术网

C++ C++;模板参数演绎不起作用

C++ C++;模板参数演绎不起作用,c++,templates,template-argument-deduction,boost-function,boost-signals2,C++,Templates,Template Argument Deduction,Boost Function,Boost Signals2,我需要覆盖boost::signals2::signal和boost::function之间的连接。 为此,我创建了以下模板函数: template<typename T> void bind(boost::signals2::signal<T> &signal, boost::function<T> function) { // override code ... } 我错过什么了吗? 是否有任何方法可以避免显式模板参数?第二个参数类型不是st

我需要覆盖
boost::signals2::signal
boost::function
之间的连接。 为此,我创建了以下模板函数:

template<typename T>
void bind(boost::signals2::signal<T> &signal, boost::function<T> function) {
  // override code ...
}
我错过什么了吗?

是否有任何方法可以避免显式模板参数?

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

template<typename T>
void bind(boost::signals2::signal<T> &signal, 
          typename std::common_type<boost::function<T>>::type function) {
  // override code ...
}
模板
无效绑定(增压::信号2::信号和信号,
typename std::common_type::type函数){
//覆盖代码。。。
}

我的信号声明是什么?@ildjarn对不起,我应该把它放在那里。它是
boost::signals2::signal my_signal模板参数推导发生在任何转换之前。第二次呼叫中没有精确匹配。bind为您提供了一些可以转换为第二个参数的内容,但这只能在模板参数推导之后发生。因此,您需要显式调用。或者,您可以将整个第二个参数设置为模板
template<typename T>
void bind(boost::signals2::signal<T> &signal, 
          typename std::common_type<boost::function<T>>::type function) {
  // override code ...
}