Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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

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++ 忽略函数的默认模板参数 模板 void addMultiplyOperation(std::functionfunc) { ... } addMultiplyOperation([](float a,int b){返回a*b;});_C++_Templates_Default Arguments - Fatal编程技术网

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) {
    // ....
}