C++ 忽略函数的默认模板参数 模板 void addMultiplyOperation(std::functionfunc) { ... } addMultiplyOperation([](float a,int b){返回a*b;});
这将导致编译器错误:C++ 忽略函数的默认模板参数 模板 void addMultiplyOperation(std::functionfunc) { ... } addMultiplyOperation([](float a,int b){返回a*b;});,c++,templates,default-arguments,C++,Templates,Default Arguments,这将导致编译器错误: template < class A, class B, class R = A > void addMultiplyOperation( std::function< R ( const A&, const B& ) > func ) { ... } addMultiplyOperation< float, int >( []( float a, int b ) { return a * b; } ); 函数
template < class A, class B, class R = A >
void addMultiplyOperation( std::function< R ( const A&, const B& ) > func )
{
...
}
addMultiplyOperation< float, int >( []( float a, int b ) { return a * b; } );
函数“int main(int,char**)”中的
错误:调用“addMultiplyOperation(main(int,char**):\uu lambda1)”时没有匹配的函数
addMultiplyOperation([](float a,int b){返回a*b;});
^
注:候选人为:
注:模板void addMultiplyOperation(std::function)
void addMultiplyOperation(std::functionfunc)
^
注意:模板参数扣除/替换失败:
注意:'main(int,char**)::_lambda1'不是从'std::function'派生的
addMultiplyOperation([](float a,int b){返回a*b;});
^
尽管将R
模板参数default初始化为A
,但我必须提供第三个参数才能编译它。为了使用默认模板参数,我还需要做些什么吗
我使用的是g++v4.8.1
尽管将R
模板参数default初始化为A
,但我必须提供第三个参数才能编译它
实际上,这与它是默认参数这一事实无关。编译器也无法推断A
和B
。看看这个简单的例子:
In function 'int main(int, char**)':
error: no matching function for call to 'addMultiplyOperation(main(int, char**)::__lambda1)'
addMultiplyOperation< float, int >( []( float a, int b ) { return a * b; } );
^
note: candidate is:
note: template<class A, class B, class R> void addMultiplyOperation(std::function<R(const A&, const B&)>)
void addMultiplyOperation( std::function< R ( const A&, const B& ) > func )
^
note: template argument deduction/substitution failed:
note: 'main(int, char**)::__lambda1' is not derived from 'std::function<R(const float&, const int&)>'
addMultiplyOperation< float, int >( []( float a, int b ) { return a * b; } );
^
如有必要,可以通过以下方法推断函数对象可以接受的参数类型,例如,如本答案中所述:
如果传入的对象实际上不可调用,或者参数数目错误,这将导致一些严重的编译错误。现在我不确定是否有一个好办法来解决这个问题。C++14中的概念应该可以缓解其中的一些问题。+1我可以理解
A
没有被推导出来,但我告诉编译器A
是什么,并且R
与A
相同。但是我不需要实现这些语言边缘案例,所以我不会抱怨。。。
template<class A>
void f(function<void(A)> f) { }
int main() {
auto lambda = [](){};
f(lambda);
}
template<class Function>
void addMultiplyOperation(Function func) {
// ....
}