面试题答案
一键面试问题分析
在DerivedClass
的成员函数中调用templateFunction
会遇到的问题是,编译器无法自动推导templateFunction
的模板参数U
。因为在非模板类DerivedClass
的成员函数中调用templateFunction
时,编译器不知道U
具体是什么类型,不像在模板类的成员函数中,编译器可以根据调用时传入的参数类型来推导模板参数。
解决方法
- 显式指定模板参数:在调用
templateFunction
时,明确指定模板参数U
的类型。 - 使用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;
}
在上述代码中:
DerivedClass
从TemplateClass<int>
派生。- 通过
using TemplateClass<int>::templateFunction;
将templateFunction
引入到DerivedClass
的作用域中。 - 在
callTemplateFunction
成员函数中,展示了两种调用templateFunction
的方式:显式指定模板参数和通过using
声明隐式推导模板参数。