C++ 中 typename 和 class 的区别

在 C++ Template 中很多地方都用到了 typename 与 class 这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?

相信学习 C++ 的人对 class 这个关键字都非常明白,class 用于定义类,在模板引入 c++ 后,最初定义模板的方法为:

template<class T>......

这里 class 关键字表明T是一个类型,后来为了避免 class 在这两个地方的使用可能给人带来混淆,所以引入了 typename 这个关键字。使用 typename 更清晰,因为它不暗示 T 必须是类类型(T 可以是基本类型如 int)。它的作用同 class 一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了:

template<typename T>......

但是其实还是有区别的。看下列代码:

template <typename T>
class MyClass {
public:
    void func() {
        typename T::Iterator* ptr;  // 使用 typename 声明 T::Iterator 是一个类型
        // ...
    }
};

当在模板中引用一个依赖于模板参数的类型时,必须使用 typename 关键字(除非是基类列表或成员初始化列表)。若不使用 typename,编译器会认为 T::Iterator 是一个静态成员(如变量或枚举值)。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐