MST

星途 面试题库

面试题:C++函数模板声明规范之基础影响

在C++中,函数模板声明规范会影响代码的可读性与可维护性。请描述函数模板声明中模板参数列表的规范要求,并举例说明一个因模板参数声明不规范导致编译错误的场景及解决办法。
41.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

模板参数列表的规范要求

  1. 类型参数:使用 typenameclass 关键字来声明模板类型参数。例如 template <typename T>template <class T>,这两种方式功能相同,但 typename 更能明确表示是类型参数。
  2. 非类型参数:可以是常量表达式,如整数、指针或引用。例如 template <int N> 声明一个整数类型的非类型参数 N。非类型参数在编译期就已知其值。
  3. 默认模板参数:可以为模板参数提供默认值,类似于函数参数的默认值。例如 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 没有使用 typenameclass 声明,这会导致编译错误。编译器不知道 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 是一个类型参数,从而顺利编译。