class与Typename的区别

一:相同点:

  在模板定义时的class和typename是没有区别的

二:不同点:

  1、typename可以表示一个嵌套依赖类型名(nested dependent type name),但是在基类列表成员初始化列表时,可以不用“typename”;

    代码: 

template<class Base>               //此处可以用typename替换
class A : public Base::B           // 基类列表
{
public:
    
    typedef typename Base::B info_type;
    
    A() : Base<T>::B               //成员初始化列表           
    {
        
    }
};

嵌套依赖类型名

针对该代码,我们可以发现,在编译时是无法知道Base的具体实现的,那么Base::B,我们则无法判断是一个类型的静态成员,还是一个类的成员函数,那么此处就会产生歧义,这种情况下,编译器默认“如果解析器在一个 template(模板)中遇到一个 nested dependent name(嵌套依赖名字),它假定那个名字不是一个 type(类型),除非你用其它方式告诉它",此时我们就需要typename,来声明Base::B为一个类型,但是在基类列表与成员初始化列表中可以省略。

2、template<typename T, template<typename T> class S>S实际是模板参数,C++规定模板参数只能是class模板,所以这里的class换成typename是不行的。

class与Typename的区别

时间: 2024-08-03 22:30:53

class与Typename的区别的相关文章

模板实现查找算法

使用模版实现顺序查找和对分查找,遇到的问题: 1.class和typename的区别 声明模板参数时,class和typename关键字等价,可以互换:(早期的C++标准中,模版参数的关键字是通过class来标识的,后引入typename关键字.typename关键字本质上是标识一个类型,所以在模版参数定义时可以代替class.) 用作“嵌套依赖类型名”,必须用typename关键字标识:(例外:继承列表/成员初始化列表中的基类初始化时,可以不用typename标识“嵌套依赖类型名”,因为编译器

C++模板相关知识点总结

1:在 C++ 中,模板是泛型编程的基础.模板是创建类或函数的蓝图或公式. 2:模板定义以关键字 template 开始,后接模板形参表,模板形参表是用尖括号括住的一个或多个模板形参的列表,形参之间以逗号分隔,模板形参表不能为空: template <typename T> int compare(const T &v1, const T &v2) { if (v1 < v2) return -1; if (v2 < v1) return 1; return 0;

模板的简单介绍与使用

什么是模板? 模板(template)指c++中的函数模板与类模板,大体对应于C#和Java众的泛型的概念.目前,模板已经成为C++的泛型编程中不可缺少的一部分. 模板定义以关键字template开始,后接模板形参表,模板形参表是用尖括号括住的一个或者多个模板形参的列表,形参之间以逗号分隔. 模板形参可以是表示类型的类型形参,也可以是表示常量表达式的非类型形参.非类型形参跟在类型说明符之后声明.类型形参跟在关键字class或typename之后定义(至于class与typename的区别实际并不

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

[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在这两个地方的使用

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> 的

C++中typename和class的区别

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