【问题标题】:Is it OK to call templated function without angle brackets?可以在没有尖括号的情况下调用模板化函数吗?
【发布时间】:2014-08-18 01:24:30
【问题描述】:

对于在 C++11 中调用模板化函数的要求,我有点困惑,其中为模板参数提供了默认值。

例如,假设我有以下模板化函数

template <class T = double> void foo()
{
  /* Do something */
}

我想在我的代码中的某个地方调用它。这些都是有效的调用吗?

foo(); //Is this OK?
foo<>();
foo<int>();

它可以在 GCC 4.7.2 中正常编译,但我不确定它是否是严格正确的 C++。我想我的不确定性可能来自使用默认模板创建模板类的实例时使用空尖括号&lt;&gt; 的要求,如下所述:

Template default arguments

但我认为在我的情况下,函数括号 () 是关键区别吗?

【问题讨论】:

  • foo()foo&lt;double&gt;() 相同。默认模板参数是你自己加的吧?
  • 我知道它们是相同的,我真的只是想知道为什么这里不需要 而是用于模板类(请参阅下面我对 Cubbi 答案的评论)。

标签: templates c++11


【解决方案1】:

对函数模板的函数调用,其中每个模板参数都是可推导的或具有默认值,可以使用空尖括号,也可以省略它们,两种方式都有效。

不同之处在于,如果您省略尖括号,您将邀请重载解析来考虑非模板函数,这些函数恰好被命名为 foo 并且恰好可以使用相同的(在这种情况下为空)参数调用列表。

这在 C++11 中没有改变。

【讨论】:

  • 感谢您的回复。那么,这种情况与我链接到的关于模板化类的新实例的情况有什么区别。在这种情况下需要尖括号而不是此处是否存在根本原因,或者它只是定义的工作方式?
  • @Wheels2050 一个是类模板,另一个是函数模板。它们只是不同的实体。
  • 对,所以这不是一些基本的东西,它只是每个定义的工作方式?
猜你喜欢
  • 2022-06-14
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2018-11-05
  • 2011-04-11
相关资源
最近更新 更多