MST

星途 面试题库

面试题:C++模板类派生非模板类:复杂场景下的问题分析

假设存在一个模板类`TemplateClass<T>`,其中包含模板成员函数`template <typename U> void templateFunction(U u);`。现在有一个非模板类`DerivedClass`从`TemplateClass<int>`派生。在`DerivedClass`的成员函数中调用`templateFunction`会遇到什么问题?如何解决?请详细分析并给出代码实现。
14.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

问题分析

DerivedClass的成员函数中调用templateFunction会遇到的问题是,编译器无法自动推导templateFunction的模板参数U。因为在非模板类DerivedClass的成员函数中调用templateFunction时,编译器不知道U具体是什么类型,不像在模板类的成员函数中,编译器可以根据调用时传入的参数类型来推导模板参数。

解决方法

  1. 显式指定模板参数:在调用templateFunction时,明确指定模板参数U的类型。
  2. 使用using声明:在DerivedClass中使用using声明引入templateFunction,这样在调用时编译器可以正确识别该函数。

代码实现

#include <iostream>

// 模板类定义
template <typename T>
class TemplateClass {
public:
    template <typename U>
    void templateFunction(U u) {
        std::cout << "TemplateClass::templateFunction: " << u << std::endl;
    }
};

// 非模板类从TemplateClass<int>派生
class DerivedClass : public TemplateClass<int> {
public:
    // 使用using声明引入templateFunction
    using TemplateClass<int>::templateFunction;

    void callTemplateFunction() {
        // 方式一:显式指定模板参数
        TemplateClass<int>::template templateFunction<double>(3.14);

        // 方式二:通过using声明,隐式推导模板参数
        templateFunction(42);
    }
};

int main() {
    DerivedClass obj;
    obj.callTemplateFunction();
    return 0;
}

在上述代码中:

  1. DerivedClassTemplateClass<int>派生。
  2. 通过using TemplateClass<int>::templateFunction;templateFunction引入到DerivedClass的作用域中。
  3. callTemplateFunction成员函数中,展示了两种调用templateFunction的方式:显式指定模板参数和通过using声明隐式推导模板参数。