【问题标题】:Why does the default argument not work in a template function?为什么默认参数在模板函数中不起作用?
【发布时间】:2021-09-03 11:56:53
【问题描述】:
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'
}

online demo

为什么默认参数在模板函数中不起作用?


编辑:我也尝试过关注,不知道为什么效果不佳。

void g(int, auto = 3.14159)
{}

【问题讨论】:

  • 第二次调用中模板参数T的类型应该如何解析?
  • 尝试将模板参数的类型也默认为double
  • 请不要在收到答复后更改您的问题。
  • 你用最后一次编辑完全改变了问题......
  • 我回滚了你的问题,以便答案有意义。如果您有新问题,请提出新问题。

标签: c++ function templates standards overload-resolution


【解决方案1】:

默认函数参数不影响模板参数推导。

模板参数也需要一个默认参数:typename T = double


至于void g(int, auto = 3.14159),好像没办法解决。

【讨论】:

  • auto 表单而不是 template 表单怎么样?查看更新的代码。
  • @xmllmx 这似乎是不可能的。
  • auto 版本本质上等同于模板版本,但存在相同问题但没有相应的解决方案,因为您无法为auto 指定默认类型。
【解决方案2】:

在第一种情况下,您在调用站点为第二个函数参数提供了一个值,编译器可以使用它来推断第二个模板参数的类型,然后让它确定要实例化的模板版本和打电话。

在第二种情况下,您没有向编译器提供有关第二个模板参数的类型的信息,因此它不能使用模板来实例化函数,因此没有具有该签名的函数可供调用。

编译器不会使用参数的默认值来推断该参数的模板参数类型(请记住,T 类型的许多选择可能会接受 double 作为默认值)。

【讨论】:

    猜你喜欢
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多