【问题标题】:Optional templated parameters for a function函数的可选模板化参数
【发布时间】:2017-06-11 14:55:36
【问题描述】:

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

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

我的问题是,为什么我不能在没有可选参数的情况下调用函数?如何做到这一点?

【问题讨论】:

  • 为什么还需要那个可选参数?这对我来说真的没有任何意义。
  • 好吧,如果你只指定4个参数,编译器没有办法推断TT(从什么推断类型?毕竟没有传递任何参数。)我想你可能想要类似于template &lt;typename TT = sometypename&gt; 的东西。

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


【解决方案1】:

因为template argument deduction默认参数不能做到; 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));

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

【讨论】:

  • 那么如果使用T而不是TT,那么可以扣除可选参数吗?
  • @Lovy 模板参数的名字根本无所谓。
  • 是的但是T是我的类模板,我的函数不是静态的,所以调用函数的时候应该定义好
  • @Lovy 静态与否无关紧要。但是,是的,如果您将 myFunction 设为不是模板,那么它将起作用。
  • @Lovy 如果将其设为非模板函数,则无需进行模板参数推导,则可以正常工作。或者你可以给TT一个默认类型。
【解决方案2】:

所有模板参数(例如TT)都应该在调用位置知道,以便了解函数内部的TT

如果调用函数的所有参数,编译器会看到第四个参数的类型是TT,因此可以推断出TT 是什么。例如。如果为零,则为TT = int

另一方面,如果只指定三个参数,编译器完全不知道TT 应该是什么。所以不能选择调用哪个版本的myFunction- is itmyFunction,myFunctionor evenmyFunction`?

如果您想要TT 的一些“默认”值,您应该明确指定:

 template <typename TT = int>
 void myFunction(int a, FooClass& b, int c,
                 int d, TT optional_e = static_cast<TT>(1));

【讨论】:

  • 感谢您的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 2022-07-20
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多