我对以下行为有点困惑。我传递一个带有两个参数的函数,其中一个参数具有默认值,作为模板参数,并使用一个参数调用该函数。为什么编译失败?并且,解决方案/解决方法是什么?
#include <iostream>
using namespace std;
template<typename Function>
void eval(Function function) {
function(10);
}
void sum(int i, int j = 0) {
cout << "Sum is " << i + j;
}
int main() {
sum(10); // OK, of course :)
eval(sum); // Error!
}
请注意,这个问题不是关于使用默认参数调用模板化函数。
错误信息:
prog.cpp: In instantiation of 'void eval(Function) [with Function = void (*)(int, int)]':
prog.cpp:15:10: required from here
prog.cpp:6:10: error: too few arguments to function
function(10);
^
这是因为可选参数是函数声明的一部分。当您使用函数指针调用时,编译器基本上只知道函数指针的类型。所以这一行function(10)
大致翻译为:
void (*)(int, int) sm = function; // the equivalent happens at the type deduction step
sm(10); // whoops, where is the second int
编译器将需要第二个参数,因为它无法知道是否sm
正在指向sum
它有一个默认参数,或其他一些void foo(int a, int b)
它没有默认参数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)