函数的可选模板化参数
Optional templated parameters for a function
我在class中有一个函数我想用,它的定义是:
template <typename T>
class FooClass
{
/* [...] */
public:
template <typename TT>
void myFunction(int a, FooClass& b, int c,
int d, TT optional_e = static_cast<TT>(1));
}
我试过这样称呼它:
obj.myFunction(a, b, c, d);
所有参数都符合它们应有的类型。
然而,Visual Studio 在编译时抛出错误:
C2783 : could not deduce template argument for TT
但是,如果我尝试以这种方式调用该函数,它会正确编译:
obj.myFunction(a, b, c, d, 0);
我的问题是,为什么我不能调用没有可选参数的函数?如何做到这一点?
所有模板参数(例如 TT
)都应该在调用位置已知,以便了解函数内部的 TT
是什么。
如果您调用函数的所有参数,编译器会看到第四个参数的类型是 TT
,因此可以推断出 TT
是什么。例如。如果它为零,则 TT = int
.
另一方面,如果你只指定三个参数,编译器完全不知道 TT
应该是什么。因此,它无法选择 myFunction
的哪个版本来调用 - is it
myFunction,
myFunctionor even
myFunction`?
如果您想要 TT
的某些 "default" 值,您应该明确指定:
template <typename TT = int>
void myFunction(int a, FooClass& b, int c,
int d, TT optional_e = static_cast<TT>(1));
因为template argument deduction无法通过默认参数完成; TT
无法推导
Type template parameter cannot be deduced from the type of a function default argument
您可以明确指定模板参数:
obj.myFunction<int>(a, b, c, d);
或者也给模板参数TT
一个默认类型。例如
template <typename TT = T>
void myFunction(int a, FooClass& b, int c,
int d, TT optional_e = static_cast<TT>(1));
请注意,您仍然可以为其明确指定类型。
我在class中有一个函数我想用,它的定义是:
template <typename T>
class FooClass
{
/* [...] */
public:
template <typename TT>
void myFunction(int a, FooClass& b, int c,
int d, TT optional_e = static_cast<TT>(1));
}
我试过这样称呼它:
obj.myFunction(a, b, c, d);
所有参数都符合它们应有的类型。
然而,Visual Studio 在编译时抛出错误:
C2783 : could not deduce template argument for TT
但是,如果我尝试以这种方式调用该函数,它会正确编译:
obj.myFunction(a, b, c, d, 0);
我的问题是,为什么我不能调用没有可选参数的函数?如何做到这一点?
所有模板参数(例如 TT
)都应该在调用位置已知,以便了解函数内部的 TT
是什么。
如果您调用函数的所有参数,编译器会看到第四个参数的类型是 TT
,因此可以推断出 TT
是什么。例如。如果它为零,则 TT = int
.
另一方面,如果你只指定三个参数,编译器完全不知道 TT
应该是什么。因此,它无法选择 myFunction
的哪个版本来调用 - is it
myFunction,
myFunctionor even
myFunction`?
如果您想要 TT
的某些 "default" 值,您应该明确指定:
template <typename TT = int>
void myFunction(int a, FooClass& b, int c,
int d, TT optional_e = static_cast<TT>(1));
因为template argument deduction无法通过默认参数完成; TT
无法推导
Type template parameter cannot be deduced from the type of a function default argument
您可以明确指定模板参数:
obj.myFunction<int>(a, b, c, d);
或者也给模板参数TT
一个默认类型。例如
template <typename TT = T>
void myFunction(int a, FooClass& b, int c,
int d, TT optional_e = static_cast<TT>(1));
请注意,您仍然可以为其明确指定类型。