乐闻世界logo
搜索文章和话题

What is the difference between " typename " and " class " template parameters?

4 个月前提问
3 个月前修改
浏览次数26

1个答案

1

在C++中,typenameclass关键字在模板参数声明中可以互换使用,它们的功能基本相同。但是,有一些细微的区别和历史背景。

历史背景

最初的C++模板仅使用class来指定类型模板参数。然而,这种用法在语义上可能引起混淆,因为模板参数不一定非要是类类型。因此,在C++标准化过程中引入了typename关键字,以更准确地表示模板参数可以是任何类型,包括基本数据类型如int、float等,也可以是类类型。

使用场景

尽管在大多数情况下这两个关键字是可以互换的,但在某些特定情况下必须使用typename而不能使用class

  1. 嵌套依赖类型指示:当需要在模板定义中指示一个依赖于模板参数的嵌套类型时,必须前置typename关键字来告诉编译器该名称表示的是一个类型。例如:

    cpp
    template <typename T> void func() { typename T::NestedType* ptr; }

    在这个例子中,typename是必需的,因为T::NestedType是一个依赖于模板参数T的类型,而编译器在模板实例化之前无法知道。如果没有typename,编译器可能会认为T::NestedType是一个静态成员。

例子

考虑以下代码:

cpp
template <class T> class DemoClass { T value; }; template <typename T> void demoFunc() { typename T::SubType* ptr; }

DemoClass的定义中,classtypename都可以用来声明类型参数T。而在demoFunc函数中,使用typename来指定T::SubType是一个类型。

总结

总的来说,typenameclass作为模板参数的用法基本相同,但typename更能准确表达参数可以是任何类型,并且在处理依赖类型时typename是必需的。对于普通的类型模板参数,使用哪一个关键字主要取决于个人或项目的编码风格习惯。

2024年6月29日 12:07 回复

你的答案