MST

星途 面试题库

面试题:C++模板类派生新类类型推导基础

假设有一个模板类`template <typename T> class Base { /*... */ };`,现在有一个派生类`class Derived : public Base<int> { /*... */ };`,请描述在这个场景下,编译器是如何进行类型推导的。如果将`Base`类的模板参数改为一个自定义结构体`struct MyStruct { int value; };`,即`class Derived2 : public Base<MyStruct> { /*... */ };`,此时的类型推导过程会有什么不同?
22.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

对于class Derived : public Base<int> { /*... */ };

  1. 模板实例化:编译器看到Derived继承自Base<int>,会实例化Base模板类,将模板参数T替换为int
  2. 类型推导:在Base类内部,如果有依赖于模板参数T的成员函数、成员变量等,它们的类型会根据T被推导为int。例如,若Base类中有一个成员函数void func(T param);,实例化后变为void func(int param);

对于class Derived2 : public Base<MyStruct> { /*... */ };

  1. 模板实例化:编译器遇到Derived2继承自Base<MyStruct>,会实例化Base模板类,把模板参数T替换为MyStruct
  2. 类型推导:与前面类似,Base类中依赖于模板参数T的成员函数、成员变量等,类型会推导为MyStruct。例如,同样的成员函数void func(T param);,现在实例化后变为void func(MyStruct param);。不同之处在于,这里的类型是自定义结构体MyStruct,相较于int这样的基本类型,MyStruct可能有更复杂的结构和行为,在Base类内部对T的操作可能涉及结构体成员的访问等操作,而对int主要是基本的算术和逻辑操作等。