C++ - 关于函数模板实例化的规则

标签 c++ templates function instantiation overloading

最近在学习函数模板,想研究一下函数模板实例化的一些规律。所以我写了下面的代码:

#include <iostream>

template <typename>
int check(int x) {
  return x * 2;
}

int main() {
  std::cout << check<double>(10) << std::endl; // #1
  std::cout << check<>(10) << std::endl;         // #2
  std::cout << check(10) << std::endl;            // #3
  return 0;
}

#1、#2 和#3 行没有全部编译在一起,每次尝试我只留下其中一个并评论其余部分。 因此,当启用 #1 时,我没有编译错误,并且打印了正确答案“20”。据我了解,"check<"double">" 调用模板实例化机制,因此真正创建了 "int check(int)" 函数(模板参数的类型不没有任何影响)。 当#3 启用时,我有一个编译错误“错误:没有匹配函数调用'check(int)'”,这是合理的,因为我正在尝试调用“check(int)" 不存在的函数。我的问题是关于 #2 的情况:在这种情况下,我得到相同的 “错误:没有匹配函数来调用 'check(int)'”。不应该调用 "check<>(10)" 触发模板实例化机制吗?

最佳答案

您不要在 <> 中放置任何模板参数。编译器如何知道要实例化哪个模板函数?请注意您的模板函数是:

template <typename>
int check(int x) 

如果你把它改成这样:

template <typename T>
int check(T x) 

然后 check<>(10) 应该没问题,因为编译器可以从参数中知道类型。

关于C++ - 关于函数模板实例化的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8448445/

相关文章:

c++ - glActiveTexutre 和 GL_TEXTURE0 不起作用,都是未声明的标识符

c++ - 如何在编译时计算类成员的偏移量?

c++ - 将类型说明符传递给模板函数

c++ - 通过几个类重用模板参数

c++ - 包含其他对象的类的复制构造函数中的取消引用语法

c++ - 有没有人真正让 NVCC 和英特尔编译器协同工作?

检查零字节

mysql - 未知的 mysql 存储函数语法错误

Python,需要一个缩进 block 吗?一个并发症

c++ - 使用哪个C++数据库或ORM API?