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 ...
}