面试题答案
一键面试模板参数列表的规范要求
- 类型参数:使用
typename
或class
关键字来声明模板类型参数。例如template <typename T>
或template <class T>
,这两种方式功能相同,但typename
更能明确表示是类型参数。 - 非类型参数:可以是常量表达式,如整数、指针或引用。例如
template <int N>
声明一个整数类型的非类型参数N
。非类型参数在编译期就已知其值。 - 默认模板参数:可以为模板参数提供默认值,类似于函数参数的默认值。例如
template <typename T = int>
,当用户在实例化模板时不指定T
的类型,就会使用默认的int
类型。
因模板参数声明不规范导致编译错误的场景及解决办法
场景
// 错误示例
template <T> // 这里没有使用typename或class声明类型参数T
class MyClass {
T data;
public:
MyClass(T value) : data(value) {}
};
int main() {
MyClass<int> obj(10);
return 0;
}
在这个例子中,模板参数 T
没有使用 typename
或 class
声明,这会导致编译错误。编译器不知道 T
是一个类型,会报类似 “expected a type specifier” 的错误。
解决办法
// 修正后的代码
template <typename T>
class MyClass {
T data;
public:
MyClass(T value) : data(value) {}
};
int main() {
MyClass<int> obj(10);
return 0;
}
通过在模板参数 T
前加上 typename
,编译器就能正确识别 T
是一个类型参数,从而顺利编译。