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

标签 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;
}

现在,如果我包含它并像这样在我的 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/

相关文章:

c++ - 有没有更好的方法在 header 中用 C++ 表达嵌套命名空间

c++ - 带有网络摄像头 c930e 罗技的 OpenCv

关于模板导出的 C++ 标准,谁能解释一下?

c++ - C++11模板参数错误绑定(bind)示例?

jquery - 创建我自己的自定义 JQuery 模板引擎?

c++ - 非类型函数模板参数

c++ - 重载箭头 ( -> ) 运算符 C++ 的问题

c++ - 推荐用于大数据处理的 C++ 并行化库是什么

c++ - 模板特化属于头文件还是源文件?

C++:处理整数和字符串的函数模板