函数的可选模板化参数

时间:2017-06-11 14:55:36

标签: c++ templates optional-parameters template-deduction

我在我想要使用的类中有一个函数,其定义是:

 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);

我的问题是,为什么我不能在没有可选参数的情况下调用该函数?怎么做?

2 个答案:

答案 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));

请注意,您仍然可以为其明确指定类型。