Dav*_*1ar 30 c++ templates default default-arguments template-argument-deduction
我尝试使用默认模板参数编写此函数:
template<typename A, typename B>
void func(int i1, int i2, A a, B b = 123){
...
}
Run Code Online (Sandbox Code Playgroud)
在我看来,我可以这样称呼它:func(1, 2, 3)
编译器应该从默认值推断出类型B
,int
但我得到了no instance of overloaded function
。
在这种情况下,C++ 构造是否不正确并且编译器无法推断出类型?
son*_*yao 46
函数中模板形参的类型无法从默认实参推导出来。如cppreference.com上的示例所示:
类型模板形参不能从函数默认实参的类型推导出来:
Run Code Online (Sandbox Code Playgroud)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){
...
}
Run Code Online (Sandbox Code Playgroud)
for*_*818 12
通常,当默认参数不起作用时,您可以使用重载:
template<typename A, typename B>
void func(int i1, int i2, A a, B b){
...
}
template<typename A>
void func(int i1, int i2, A a){
func(i1,i2,a,123);
}
Run Code Online (Sandbox Code Playgroud)