繁体   English   中英

函数的可选模板化参数

[英]Optional templated parameters for a function

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

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

因为默认情况下无法完成模板参数推导 无法推断出TT

类型模板参数不能从函数默认参数的类型推导出

您可以显式指定模板参数:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM