typename T和class T区别与联系

按 C++ 标准来说,template<typename T> 用于基础数据类型,typename 指类型名,T 可以取 char int double 等。

template<class T> 用于类,T 可以取任何类。

但是这里有一个问题,结构体应该用 typename 还是 class? 结构体肯定不是基础数据类型,但也不是类。

所以实际情况是,template<class T> 的 T 也可以取基础数据类型,tempate<typename T> 的 T 也可以取类。 

但有一个特例,就是当 T 是一个类,而这个类又有子类(假设名为 innerClass) 时,应该用 template<typename>:

typename T::innerClass   myInnerObject;

这里的 typename 告诉编译器,T::innerClass 是一个类,程序要声明一个 T::innerClass 类的对象,而不是声明 T 的静态成员,而 typename 如果换成 class 则语法错误。
时间: 2024-10-13 19:14:06

typename T和class T区别与联系的相关文章

c++模板编程-typename与class关键字的区别

最近一直在研究c++模板编程,虽然有些困难,但希望能够坚持下去.今天,在书上看见一个讨论模板编程typename与class两个关键字的区别,觉得挺有意义的,就把它们给总结一下. 先看一个例子: template<typename C> typename C::value_type sum(C &c){ typedef typename C::value_type value_type; typedef typename C::iterator iterator; value_type

C++模板之typename和class关键字的区别

我们都知道,在STL中基本上都使用了模板类的声明,即template.在模板类的声明中,我们有两种方式: template <class T> template <typename T> 在这里,class和typename是相同的.也就是说,在声明一个template type parameter(模板类型参数)的时候,class和typename意味着 完全相同的东西. 但是,在C++中,有的时候必须要使用typename.下面我们列举下面一个例子. 关键字typename被用

class与Typename的区别

一:相同点: 在模板定义时的class和typename是没有区别的 二:不同点: 1.typename可以表示一个嵌套依赖类型名(nested dependent type name),但是在基类列表和成员初始化列表时,可以不用"typename"; 代码: template<class Base>               //此处可以用typename替换 class A : public Base::B           // 基类列表 { public:   

[Reprint]c++中typename和class的区别介绍

在c++Template中,很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字都非常明白,class用于定义类.在模板引入c++后,最初定义模板的方法为: template<class T>...... 在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字.它的作用同class一样表明后面的符号为一个类型,这样在定义

typename与class的区别

我们都知道,在STL中基本上都使用了模板类的声明,即template.在模板类的声明中,我们有两种方式: template <class T> template <typename T> 在这里,class和typename是相同的.也就是说,在声明一个template type parameter(模板类型参数)的时候,class和typename意味着 完全相同的东西. 但是,在C++中,有的时候必须要使用typename.下面我们列举下面一个例子. 关键字typename被用

c++中typename和class的区别介绍

"typename"是一个C++程序设计语言中的关键字.相当用于泛型编程时是另一术语"class"的同义词.这个关键字用于指出模板声明(或定义)中的非独立名称(dependent names)是类型名,而非变量名. 学习C++的人对class这个关键字都非常明白,class用于定义类.在模板引入c++后,最初定义模板的方法为: template<class T>...... 在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用

C++中typename和class的区别

在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字都非常明白,class用于定义类,在模板引入c++后,最初定义模板的方法为: template<class T>...... 在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,它的作用同 class一样表明后面的符号为一个类型,这样在定义

struct和class区别

转载来源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能.struct能包含成员函数吗? 能!struct能继承吗? 能!!struct能实现多态吗? 能!!! 既然这些它都能实现,那它和class还能有什么区别? 最本质的一个区别就是默认的访问控制: 默认的继承访问权限 struct是public的,class是

C++中的链表节点用模板类和用普通类来实现的区别

C++中的链表节点通常情况下类型都是一致的.因此我们可以用模板来实现. #include <iostream> using namespace std; template<typename Type>//定义一个模板类必须有的声明 class LinkNode //表示链表节点的类 { public: LinkNode() :m_pnext(nullptr){}//构造函数,在函数体内实现的相当于默认在前面加了inline关键字修饰 LinkNode(Type item, Link