为什么默认参数在模板函数中不起作用?
Why does the default argument not work in a template function?
struct A {};
template<typename T>
void f(int n, T m = 3.14159)
{}
int main()
{
f(8, A{}); // ok
f(8); // error: no matching function for call to 'f'
}
为什么默认参数在模板函数中不起作用?
编辑:我也试过跟随,想知道为什么它不起作用。
void g(int, auto = 3.14159)
{}
默认函数参数不影响模板参数推导。
您还需要模板参数的默认参数:typename T = double
。
至于void g(int, auto = 3.14159)
,好像没办法解决了
在第一种情况下,您在调用点为第二个函数参数提供了一个值,编译器可以使用它来推断第二个模板参数的类型,然后让它确定要使用哪个版本的模板实例化并调用。
在第二种情况下,您没有向编译器提供有关第二个模板参数类型的信息,因此它无法使用模板来实例化函数,因此没有可调用的具有该签名的函数。
编译器不会使用参数的默认值来推断该参数的模板参数类型(请记住,T
类型的许多选择可能会接受 double
作为默认值值)。
struct A {};
template<typename T>
void f(int n, T m = 3.14159)
{}
int main()
{
f(8, A{}); // ok
f(8); // error: no matching function for call to 'f'
}
为什么默认参数在模板函数中不起作用?
编辑:我也试过跟随,想知道为什么它不起作用。
void g(int, auto = 3.14159)
{}
默认函数参数不影响模板参数推导。
您还需要模板参数的默认参数:typename T = double
。
至于void g(int, auto = 3.14159)
,好像没办法解决了
在第一种情况下,您在调用点为第二个函数参数提供了一个值,编译器可以使用它来推断第二个模板参数的类型,然后让它确定要使用哪个版本的模板实例化并调用。
在第二种情况下,您没有向编译器提供有关第二个模板参数类型的信息,因此它无法使用模板来实例化函数,因此没有可调用的具有该签名的函数。
编译器不会使用参数的默认值来推断该参数的模板参数类型(请记住,T
类型的许多选择可能会接受 double
作为默认值值)。