当前位置: 首页 > 知识库问答 >
问题:

C++能从默认值推导出参数类型吗?

顾淳
2023-03-14

我尝试用一个默认模板参数编写这个函数:

template<typename A, typename B>
void func(int i1, int i2, A a, B b = 123){
    ...
}

在我看来,我可以这样称呼它:func(1,2,3)和编译器应该从默认值导出类型bint,但我得到的没有重载函数的实例
在这种情况下C++构造不正确,编译器不能导出类型吗?

共有1个答案

桂志新
2023-03-14

函数中模板参数的类型不能从默认参数推导出来。如cpPreference.com上的示例所示:

不能从函数默认参数的类型推导出类型模板参数:

template<typename T> void f(T = 5, T = 7); 

void g()
{
    f(1);     // OK: calls f<int>(1, 7)
    f();      // error: cannot deduce T
    f<int>(); // OK: calls f<int>(5, 7)
}

但是,可以为模板参数指定默认参数:

template<typename A, typename B = int>
void func(int i1, int i2, A a, B b = 123){
    ...
}
 类似资料:
  • 使用以下代码生成时 生成以下诊断(代码后): 诊断: 有趣的部分不是关于歧义错误本身(这不是这里主要关注的问题)。有趣的是,当仅使用函数名调用fun时,第一个fun的模板参数F被解析为纯函数类型double(double),而第二个fun的模板参数F被解析为更期望的函数指针类型。 然而,当我们将调用<代码>乐趣(测试) 更改为<代码>乐趣( 这种行为似乎是所有Clang和GCC(以及Visual

  • 对于一些函数,你可能希望它的一些参数是 可选 的,如果用户不想要为这些参数提供值的话,这些参数就使用默认值。这个功能借助于默认参数值完成。你可以在函数定义的形参名后加上赋值运算符(=)和默认值,从而给形参指定默认参数值。 注意,默认参数值应该是一个参数。更加准确的说,默认参数值应该是不可变的——这会在后面的章节中做详细解释。从现在开始,请记住这一点。 使用默认参数值 例7.5 使用默认参数值 #!

  • 在 C++中,定义函数时可以给形参指定一个默认的值,这样调用函数时如果没有给这个形参赋值(没有对应的实参),那么就使用这个默认的值。也就是说,调用函数时可以省略有默认值的参数。如果用户指定了参数的值,那么就使用用户指定的值,否则使用参数的默认值。 所谓默认参数,指的是当函数调用中省略了实参时自动使用的一个值,这个值就是给形参指定的默认值。下面是一个简单的示例: 运行结果: 10, 3.5, # 2

  • 我有一个VUE2项目,我编写了一个简单的函数来翻译日期中的月份,我想将它导入到我的一个组件中,但是我得到了一个错误: 在“@/utils/date-translation”中找不到导出“default”(导入为“translate date”) src文件夹中的相对文件路径是正确的,我导出的函数如下所示: 然后我将其导入到组件中,如下所示: 我做错了什么?

  • 我如何在从下面的API生成的swagger中定义属性的默认值? Swashbuckle生成OrderDirection作为所需参数。我希望它是可选的,并向客户机指示默认值(不确定swagger是否支持此选项)。 我不喜欢使属性类型为空。还有其他选择吗?理想情况下使用内置类... 我用的是虚张声势的皮带扣。AspNetCore-https://docs.microsoft.com/en-us/asp

  • Scala 函数 Scala 可以为函数参数指定默认参数值,使用了默认参数,你在调用函数的过程中可以不需要传递参数,这时函数就会调用它的默认参数值,如果传递了参数,则传递值会取代默认值。实例如下: object Test { def main(args: Array[String]) { println( "返回值 : " + addInt() ); } def