MST

星途 面试题库

面试题:C++函数模板类型参数替换的常见问题

在C++函数模板中,假设有如下模板定义:template <typename T> void func(T a, T b) { /* 函数体 */ }。当调用func(1, 2.5)时,类型参数T的替换过程会出现什么问题?如何解决这个问题?
22.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 问题
    • 当调用func(1, 2.5)时,第一个参数1的类型是int,第二个参数2.5的类型是double。由于函数模板func要求两个参数类型相同(template <typename T> void func(T a, T b)),这里编译器无法确定类型参数T到底是int还是double,会产生类型不匹配的编译错误。
  2. 解决方法
    • 显式指定类型
      #include <iostream>
      template <typename T> void func(T a, T b) {
          std::cout << "a + b = " << a + b << std::endl;
      }
      int main() {
          func<double>(1, 2.5);
          return 0;
      }
      
      在调用函数时,通过func<double>(1, 2.5)显式指定类型参数Tdouble,这样第一个参数1会隐式转换为double类型,从而使函数调用成功。
    • 修改函数模板
      #include <iostream>
      template <typename T1, typename T2> void func(T1 a, T2 b) {
          std::cout << "a + b = " << static_cast<double>(a)+static_cast<double>(b) << std::endl;
      }
      int main() {
          func(1, 2.5);
          return 0;
      }
      
      将函数模板修改为接受两个不同类型的参数T1T2,并在函数体中进行合适的类型转换(这里转换为double类型进行计算),这样就可以处理不同类型参数的情况,调用func(1, 2.5)也能成功。