C++ 可以从默认值推断参数类型吗?
Can C++ deduce argument type from default value?
我尝试使用默认模板参数编写此函数:
template<typename A, typename B>
void func(int i1, int i2, A a, B b = 123){
...
}
在我看来,我可以这样称呼它:func(1, 2, 3)
并且编译器应该从默认值中将类型 B
推断为 int
,但我得到 no instance of overloaded function
。
在这种情况下,C++ 构造是否不正确,编译器无法推断类型?
无法从默认参数推导出函数中模板参数的类型。如 cppreference.com 上的示例所示:
Type template parameter cannot be deduced from the type of a function
default argument:
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){
...
}
通常当默认参数不起作用时,您可以使用重载:
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);
}
我尝试使用默认模板参数编写此函数:
template<typename A, typename B>
void func(int i1, int i2, A a, B b = 123){
...
}
在我看来,我可以这样称呼它:func(1, 2, 3)
并且编译器应该从默认值中将类型 B
推断为 int
,但我得到 no instance of overloaded function
。
在这种情况下,C++ 构造是否不正确,编译器无法推断类型?
无法从默认参数推导出函数中模板参数的类型。如 cppreference.com 上的示例所示:
Type template parameter cannot be deduced from the type of a function default argument:
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){
...
}
通常当默认参数不起作用时,您可以使用重载:
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);
}