我仍在尝试找出模板。我已阅读特化规则,但不明白这里发生了什么。
我在 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;
}
现在,如果我包含它并像这样在我的 main 中调用它
f(1);
f("x");
我明白了
one
one
现在的问题是,为什么第一个比第二个更具体?我觉得它至少应该是模棱两可的,根本不起作用。
最佳答案
首先,您没有特化,而是两个独立的、不相关的重载。
其次,第二个重载通常是不可行的,因为您在没有模板参数的情况下调用该函数,因此无法推导出模板参数 bar
。所以只有第一个重载是可行的,并被使用。
实际的特化应该是这样的:
template <>
void f<int>(int p) { /* ... */ }
更好的是,坚持重载(重载函数通常比提供模板特化更好),但使第二个成为非模板:
void f(int p) { /* ... */ }
关于c++ - 将调用两个重载模板中的哪一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11755488/