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)
现在的问题是,为什么第一个更具体而不是第二个用于整数?我觉得它至少应该是模棱两可的,根本不起作用.
首先,您没有专业化,而是两个独立的无关重载.
其次,第二个重载通常是不可行的,因为你在没有模板参数的情况下调用函数,因此没有办法推导出模板参数bar.所以只有第一次过载是可行的,并且被使用.
实际的专业化将如下所示:
template <>
void f<int>(int p) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
更好的是,坚持使用重载(通常更好地重载函数而不是提供模板特化),但是使第二个成为非模板:
void f(int p) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)