我在我想要使用的类中有一个函数,其定义是:
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);
我的问题是,为什么我不能在没有可选参数的情况下调用该函数?怎么做?
答案 0 :(得分:3)
所有模板参数(例如TT
)都应该在调用位置知道,以便了解函数内部TT
的内容。
如果你调用函数所有的参数,编译器会看到第四个参数的类型是TT
,因此可以推断出TT
是什么。例如。如果它为零,那么TT = int
。
另一方面,如果仅指定三个参数,编译器完全不知道TT
应该是什么。因此,它无法选择myFunction
哪个版本调用- is it
myFunction ,
myFunction or even
myFunction`?
如果您想要TT
的某个“默认”值,则应明确指定:
template <typename TT = int>
void myFunction(int a, FooClass& b, int c,
int d, TT optional_e = static_cast<TT>(1));
答案 1 :(得分:3)
默认参数无法执行Becuase template argument deduction; TT
无法推断出来。
无法从函数默认参数
的类型推导出类型模板参数
您可以明确指定模板参数:
obj.myFunction<int>(a, b, c, d);
或者也为模板参数TT
提供默认类型。 e.g。
template <typename TT = T>
void myFunction(int a, FooClass& b, int c,
int d, TT optional_e = static_cast<TT>(1));
请注意,您仍然可以为其明确指定类型。