【问题标题】:C++ template function selection [duplicate]C ++模板函数选择[重复]
【发布时间】:2014-05-05 20:43:06
【问题描述】:
template<typename TA, typename TB>
void foo (TA a, TB b); // #1

template<typename T>
void foo (T a, T b); // #2

int a, b;    
foo(a, b);

在这种情况下,调用 foo #2。为什么?

【问题讨论】:

  • @πάνταῥεῖ:我不确定这与这个问题有什么关系。
  • @OliCharlesworth 我也不是 ;) ...认为 dyp 的评论更符合我想要表达的意思。
  • 在这种情况下,两个模板都会生成一个函数签名void foo(int, int),因此它们是根据部分排序又名哪个更专业 i>.
  • 一个非常的详细解释可以在这里找到stackoverflow.com/q/17005985/420683
  • @dyp:谢谢。部分排序似乎是关键。我认为重要的是要注意,在偏序中,一个函数模板可以比另一个函数模板更特化,但这并不意味着或要求一个是另一个的特化。当我第一次寻找答案时,这个术语让我有些困惑。

标签: c++ templates


【解决方案1】:

如果你要明确模板参数,你会使用:

foo<int, int>(a, b);

调用第一个函数。

你会使用:

foo<int>(a, b);

调用第二个函数。

由于你让编译器选择函数,它选择了更严格的函数,也就是第二个。

为什么第二个更严格?编译器必须推断出一种类型才能使用第二个函数。它必须推导出两种类型才能使用第一种。

【讨论】:

  • 我认为foo&lt;int&gt;(a, b) 仍然执行重载解析,并且只使用第二个函数,因为那个函数更专业。
  • IMO 第二个是更多限制性的,因此更专业:它分别推导两个参数的类型,如果推导的类型不是同样,扣分失败。
  • @dyp 我认为你是对的。感谢您指出错误。更新了我的答案。
猜你喜欢
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 2010-11-22
  • 2013-12-27
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多