将调用两个重载模板中的哪一个?

Sar*_*ien 3 c++ templates function-templates

我仍在试图弄清楚模板.我已经阅读了有关专业化规则的内容,并且不明白这里发生了什么.

我在templates.h中定义了以下内容:

#include <iostream>

template <typename foo>
void f(foo p)
{
  std::cout << "one" << std::endl;
}

template <typename bar>
void f(int p)
{
  std::cout << "two" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我包括这个,并在我的主要像这样称呼它

  f(1);
  f("x");
Run Code Online (Sandbox Code Playgroud)

我明白了

one
one
Run Code Online (Sandbox Code Playgroud)

现在的问题是,为什么第一个更具体而不是第二个用于整数?我觉得它至少应该是模棱两可的,根本不起作用.

Ker*_* SB 5

首先,您没有专业化,而是两个独立的无关重载.

其次,第二个重载通常是不可行的,因为你在没有模板参数的情况下调用函数,因此没有办法推导出模板参数bar.所以只有第一次过载是可行的,并且被使用.


实际的专业化将如下所示:

template <>
void f<int>(int p) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

更好的是,坚持使用重载(通常更好地重载函数而不是提供模板特化),但是使第二个成为非模板:

void f(int p) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)