首页
学习
活动
专区
工具
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可以避免歧义,并且具有更好的可读性。

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

相关·内容

  • 真没想到nullptrNULL得区别,大了去了

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

    1.7K30

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

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

    1.4K20

    C++ 模板学习

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

    944100

    将模板申明为友元

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

    76211

    Modern c++快速浅析

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

    17910

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

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

    46920

    C++ 学习笔记

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

    6.7K63

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

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

    1.3K10

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

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

    60310

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

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

    80120

    C++ 模板沉思录(上)

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

    1.3K20

    LLVM Pass 其一:PassManager

    Pass(从语法角度来说),也就是说PassManager本身也是一个Pass 接着来讲一下模板参数 IRUnit 对于每个Pass其作用范围,有的是作用在函数上,有的是作用到一个CFG中 还记得上期里讲到新...一开始这里写法感到奇怪,为什么都跑完了、修改过了还是preserved。...AnalysisManager信息,觉得理论上来说如果每个人在Pass里面自己做了AM.invalidate操作本质上是一样,在这里只是PassManager帮你做了这个事情(这里不考虑这个做法是否必要...addPass 还是熟悉enable_if,主要是根据参数是RepeatedPass还是普通Pass以及PassT是否满足HasRunOnLoopT产生了四种情况 template <typename...部分,因此在addPass时候同时会将initfinalPass注册进去 template void addPass(PassT &&Pass) { Base

    1.7K10
    领券