MST

星途 面试题库

面试题:C++ 泛型编程之模板函数重载

请解释在 C++ 泛型编程中,模板函数重载的规则是什么?假设有两个模板函数 `template <typename T> void func(T a);` 和 `template <typename T> void func(T* a);`,当调用 `func(new int(5));` 时会调用哪个函数,为什么?
39.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 模板函数重载规则
    • 精确匹配优先:更具体的模板特化或非模板函数优先于一般的模板函数。例如,如果存在一个针对特定类型的模板特化,对于该类型的参数调用会优先使用这个特化版本。
    • 根据模板实参推导:编译器尝试根据传入的实参来推导模板参数。如果对不同的模板函数,模板实参推导的结果不同,就会选择不同的函数。
    • 匹配度:更匹配的模板函数会被选择。例如,对于指针类型,如果有一个模板函数专门针对指针参数,而另一个是针对一般类型参数,对于指针实参,针对指针的模板函数更匹配。
  2. 对于func(new int(5));调用的分析
    • 会调用template <typename T> void func(T* a);函数。
    • 原因是new int(5)返回一个int*类型的指针。对于template <typename T> void func(T a);,模板参数T会被推导为int*,此时aint*类型。而对于template <typename T> void func(T* a);,模板参数T会被推导为int,此时a同样是int*类型。但是template <typename T> void func(T* a);模板函数专门针对指针类型,与int*实参的匹配度更高,所以会调用template <typename T> void func(T* a);函数。