首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

template <typename T>和template <class T>之间有什么区别.对我来说,两者都产生了相同的结果

在C++模板中,typenameclass关键字是可以互换使用的,它们之间的区别主要在于语法和可读性上。

  1. 语法:typenameclass都可以用来声明模板参数类型,但是在某些情况下,使用typename可以避免歧义。例如,当模板参数类型依赖于模板参数的类型时,使用typename可以明确表示该类型是一个类型名称,而不是一个变量名称。

例如:

代码语言:cpp
复制
template<typename T>
class MyClass {
    typename T::SubType mySubType; // 使用typename表示T::SubType是一个类型名称
};
  1. 可读性:typenameclass都可以用来声明类型,但是typename更具有可读性,因为它明确表示该类型是一个类型名称,而不是一个变量名称。

综上所述,typenameclass在C++模板中都可以用来声明模板参数类型,但是在某些情况下,使用typename可以避免歧义,并且具有更好的可读性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 真没想到nullptr和NULL得区别,大了去了

    第3章 转向现代C++ 条款7:在创建对象时注意区分()和{} //创建对象时候注意区分 () 和 {} //指定初始化的方式有:小括号,等号,大括号 //情况1:内建型别来说 int 初始化和赋值没有区别...的返回值型别的话,result是指针型别还是整数型别就不清楚了 //0 作为结果值两者都有可能 } if(result == nullptr){ //result必然具备指针型别 }...14 就是 C++11的 using 声明 templateclass T> using remove_const_t = typename remove_constT>::type template...std::size_t型别值得函数必须在编译期就要计算出结果 //意味着必须使用 constexpr 函数 //C++11 templatetypename E> constexpr typename...templatetypename T> void processPointer(T* ptr); //下面说说指针世界得两个异类 //1,void*指针,无法对其进行自增,自减得操作 //2,char

    1.8K30

    C++ 模板学习

    函数模板的写法 函数模板的一般形式如下: Template class或者也可以用typename T> 返回类型 函数名(形参表) {//函数定义体 } 说明: template是一个声明模板的关键字...类模板的写法 定义一个类模板: Template class或者也可以用typename T > class类名{ //类定义...... }; 说明:其中,template是声明各模板的关键字,表示声明一个模板...,以下是一个可打印STL中顺序和链的容器的模板函数 template typename T> void print(T v) {  T::iterator itor;  for (itor = v.begin...它去除const修饰,绝不会用const类型实例化函数模板,总是用相应的非 const类型,不过对于指针来说,指针和 const 指针是不同的类型。...DoSome   {   void operator()( int i );   }   DoSome dosome; 这里类(对 C++ 来说,struct 和类是相同的) 重载了 () 操作符,因此它的实例

    970100

    C++17常用新特性(十一)---折叠表达式

    从C++17开始,可以使用二元操作符对形参包中的参数进行计算,这一特性主要针对可变参数模板进行提升。支持的二元操作符多达32个。例如,下面的函数将会返回传入的所有的参数的和。...同样,如果将Sum函数进行改写,重新运行后虽然结果相同,但是折叠表达式展开后各个参数的组合就发生了变化。...如下面代码: templatetypename T> auto sum_s(T arg) { return arg; } templatetypename T1, typename......不妨考虑一下,一元表达式是怎么处理的呢?实际上,对一元表达式使用折叠时需要注意参数的顺序,不同的顺序输出的结果可能是不同的,如下面的表达式所示: templatetypename......2.3 使用折叠处理类型 通过使用类型特征,可以判断类或者函数中传入的参数类型是否相同。实现方式如下: templatetypename T1, typename...

    1.6K20

    将模板申明为友元

    代码编译运行环境:VS2012+Debug+Win32 ---- 严格来说,函数模板(类模板)是不能作为一个类的友元的,就像类模板之间不能发生继承关系一样。...#include using namespace std; templatetypename T>class A; templatetypename T>void show(const...,和第一种方式相同。...---- 2.把类模板声明为类模板的友元 把类模板声明为类模板的友元可以有两种方式。 2.1在类模板内部对模板类进行友元申明 这里要注意是对实例化后的模板类将其申明为类模板的友元,而不是类模板。...不过,这两种方式在概念上还是有一些差异。第一种方式,类模板B的实例化依赖于类模板A的参数T。也就是说,对于一个特定的模板类At>来说,只有一个B的实例Bt>是它的友元类。

    77411

    函数模板参数(函数参数在哪)

    用typename和class类型声明的参数称为虚拟类型参数,而用《类型修饰》声明的参数称为常规参数 4)函数模板含有常规形参。...前两种形式是等价的,也就是说,在声明模板形参时,关键字typename和class可以互换。用typename或class声明的参数称为虚拟类型参数;而用“类型修饰”声明的参数则称为常规参数。...A.template T> B.template class T1,T2> C.template class T1,class T2> D.template...在“和“>”之间)或从模板“函数实参表”(在“(”和“)”之间),“模板实参表”的信息优先于“函数实参表”的信息。...例1.1.5 有如下函数模板定义: template class T> T func (T x, T y){ return x*x+y*y;} 在下列对func的调用中

    3.1K30

    【C++篇】走进C++初阶模版:感受模版奇妙

    你的支持是我继续创作的动力! 点赞、收藏与分享:觉得这篇文章对你有帮助吗?别忘了点赞、收藏并分享给更多的小伙伴哦!你们的支持是我不断进步的动力!...1.1 交换后的字符: B A 1.2.4 模板中的typename与class 在定义模板时,typename和class是可以互换的。...你可以选择以下两种方式: templatetypename T> // 使用 typename templateclass T> // 使用 class 虽然两者都可以完成指定功能...2.1.1 类模板的定义格式 定义类模板的语法格式如下: templateclass T> class 类名 { // 类的成员变量和方法 }; 2.1.2 示例:类模板示例 下面是一个简单的栈...如果此篇文章对你学习C++有帮助,期待你的三连,你的支持就是我创作的动力!!! 下一篇文章再会.

    6610

    Modern c++快速浅析

    因为这是一个拷贝指针的操作,因此保留原指针的不可更改指向性并没有太大的意义 auto 大多数情况下auto推断出来的结果和模板类型推导的结果是一样的,不同点在于对大括号初始物的处理 值与指针等推导 const...(alias templates),这是typedef无法轻易做到的 templatetypename U> class MyAlloc {}; templatetypename T, typename...对于刚学习C++不久的人来说,最常见的typename的使用场所就是模板了 templatetypename T> templateclass T> 上例中typename与class并无任何差别...初学者选择typename可能会对模板有更好的了解(毕竟若模板传进来的是int,它是内置类型,看起来不是一个class) 进入正题,使用typename可以明确的告诉编译器,后面跟着的这个名字是类中的类型成员...200 lambda(); } }; 或者显式指明捕获this指针,也是能够修改和访问类成员 auto lambda = [this]() { data = 200; }; 但是上述两者都是对指针的捕获

    20410

    【Modern Cpp】从万能引用到完美转发

    你好,我是雨乐! 但凡阅读过源码,就知道STL里面充斥着大量的T&&以及std::forward,如果对这俩特性或者原理不甚了解,那么对源码的了解将不会很彻底,或者说是一知半解。...此时,假设fun()函数有两个参数,那么我们的wrapper()函数则需要如下编写: template typename T> void wrapper(T& u, T& v) { fun(u...既然提到了类型推导,在C++中涉及到类型推导的往往有模板(此处需为函数模板,类模板可行的原因在下面会有分析)和auto两类,最常见的万能引用方式如以下两种: 函数模板: templatetypename...如果原始两个引用中的任何一个是左值,则结果是左值,否则是右值(即如果两者都是右值)。...所以上面,由于T&是一个int&&,即一个左值引用的左值引用,结果是一个左值引用,对于T&&来说是int&&&,所以r2也是一个左值。

    52121

    C++ 学习笔记

    C++17 中, 无链接属性也可 4.内部链接:如果一个名称对编译单元(.cpp)来说是局部的,在链接的时候其他的编译单元无法链接到它且不会与其它编译单元(.cpp)中的同样的名称相冲突。...如果一个名称对编译单元(.cpp)来说不是局部的,而在链接的时候其他的编译单元可以访问它,也就是说它可以和别的编译单元交互。...折叠表达式 1.C++17 提供了一种可以用来计算参数包(可以有初始值)中所有参数运算结果的二元运算符 ......下面定义的 operater = 只能用于不同类型的 stack 之间的赋值,若是相同类型,仍然采用默认的赋值运算符。... class S { // 特化后的模板3定义,此处定义对main中的实例化调用是不可见的 }; 模板全特化之后的类和由相同的特化参数实例化后的类是相同的,不能同时存在。

    6.8K63

    两万字长文,见过最好的模板元编程文章!

    T, templatetypename> class A> someclass {};”; 模板参数可以有默认值(函数模板参数默认是从 C++11 开始支持); 函数模板的和函数参数类型有关的模板参数可以自动推导...在定义模板特例之前必须已经有模板通例(primary template)的声明; 模板特例并不要求一定与通例有相同的接口,但为了方便使用(体会特例的语义)一般都相同; 匹配规则,在模板实例化时如果有模板通例...,毕竟迭代器就是模拟指针,但指针没有嵌套类型 value_type,可以定义 mysum() 对指针类型的特例,但更好的办法是在函数参数和 value_type 之间多加一层 -- 特性(traits)...实例化的结果是产生具体类型(类模板)或函数(函数模板),同一模板实参完全等价将产生等价的实例类型或函数; 模板一般在头文件中定义,可能被包含多次,编译和链接时会消除等价模板实例; template、typename...、this 关键字用来消除歧义,避免编译错误或产生不符预期的结果; C++11 对模板引入了新特性:“>>”、函数模板也可以有默认参数、变长模板参数、外部模板实例(extern),并弃用 export

    1.4K10

    C++模板初阶

    typename可以使用class来代替,这个T也可以用其他字符来代替 // 不过typename的可读性会有一点提高,因为typename本身就是类型名称的缩写 void Swap(T& left...,所以也就是一个函数模板只能同时对一个类型进行推演,但是如果在函数模板中使用多个参数,自然就可以同时对不同的类型进行推演: template typename T1,typename T2> T1...,编译器有足够的泛型参数对两个不同的类型进行推演,不过返回值还是只能是两个类型中的一个。...3.模板可以和实例函数同时存在,编译器优先调用实例函数 template typename T1,typename T2> T1 Add(T1& left, T2& right) { return...templatetypename T,size_t N> //T是类型参数,N是非类型参数 class Array { private: T _Array[N]; }; int main()

    62700

    uml结构建模_uml面向对象分析建模与设计

    例如:简单工厂模式 主要用于创建对象,新添加类时,不会影响以前的系统代码。核心思想是用一具工厂来根据输入的条件产 生不同的类,然后根据不同类的virtual函数得到不同的结果。...小学生的四则运算法则为例,对应UML.类如下: 下面简单做一个UML模型和C++类实例来实现一下 代码实现: 头文件: // 设计操作基类 template typename T> class...rah = rpa; } // 加法模板类 templatetypename T> class CAddOperator :public COperatorT> { public:...return COperatorT>::lah - COperatorT>::rah; } }; // 乘法模板类 templatetypename T> class CMulOperator...T>::rah; } }; // 除法模板类 templatetypename T> class CDivOperator :public COperatorT> { public:

    43220

    C++ 实现 STL 标准库和算法(二)template 编程和迭代器粗解 实验楼笔记

    三、函数模板 模板的基本语法如下: template typename/class T> template 告诉编译器,接下来是一个模板 ,typename 和 class 都是关键字,在这里二者可以互用没有区别...四、类模板和成员模板 类模版 c++11 不仅支持对函数的模板化,也支持对类的模板,下面来看基本的语法是怎样的: template class T> class Myclass { T a; public...我们先看一个简单的例子,用上面的类改编而来: template class T> class Myclass { public: T a; template typename type_1 , typename...也可以说是编译器生成了 int 和 double 两个版本的类定义。 六、typename 和 class typename和class是模板中经常使用的两个关键词 ,在模板定义的时候没有什么区别。...以前用的是 class,后来 c++ 委员会加入了 typename。因为历史原因,两个是可以通用的。对有些程序员来说,在定义类模板的时候,常常使用 class 作为关键字,增加代码可读性。

    60910

    C++打怪升级(八)- 泛型编程初见

    ,而是class/typename来表示通用类型; typename也是一个C++关键字; templatetypename T1,typename T2,......; 这并不冲突,函数模板不是函数,不会与实际函数冲突; 就算模板函数实例化出具体的函数也不会和已经存在的实际函数冲突,因为我们写的函数和函数模板生成的函数虽然完成相同的功能,但是二者是完全不同的函数...,注意类模板名字不是真正的类,而实例化的结果才是真正的类(也就是类模板名加上具体的类型是真正的类名); 这里有个问题,类模板实例化为什么必须在其后加上呢?..." template class A; templatetypename T> AT>::A(T a) :_a(a) {} templatetypename T> AT>::A(...() { cout << _a << endl; } ---- 一个练习 对类的使用像普通数组一样(本质不一样) //定义在命名空间中,防止和库里面的类名冲突 namespace weihe { template

    81620

    C++ —— 关于模板进阶

    非类型模板参数 模板参数分为 类型形参 与 非类型形参 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称 //类型模板参数 templateclass T> 非类型形参...函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误 // 函数模板 -- 参数匹配 //原模板 templateclass T> bool Less(T left..., T right) { return left < right; } // 对Less函数模板进行特化 //给一对 template //在函数名(Less)和参数(Date* left...; T2 _d2; }; //两个参数偏特化为引用类型 template typename T1, typename T2> class Data T1&, T2&> { public:...一般来说,模板是不支持 声明 和 定义 分离的 假如有以下场景,模板的声明与定义分离开,在头文件中进行声明,源文件中完成定义

    5900

    C++ 模板沉思录(上)

    那么,“加法”和“+”,“两个”和“形参的数量是2”,以及“数”和int、double、unsigned等等之间的关系是什么? 是抽象。...这里对其进行简要介绍。 可变参数模板表达了“参数数量,以及每个参数的类型都未知且各不相同”这一语义。...不过有了上一个问题的铺垫,这里我们依然要思考的是:一个类类型,有什么独一无二的东西是非类类型所没有的?(这样我们似乎就能让编译器在“喜欢和不喜欢”之间做出抉择) 也许你将恍然大悟:类的成员指针。...Types> class StrongerType; // 只有一个类型 template typename T> class StrongerTypeT> { // 我自己就是“最强大的...请看以下示例: // Plus函数的返回值应该是T1与T2之间的“更强大类型” template typename T1, typename T2> typename StrongerTypeT1,

    1.3K20
    领券