C++ 中 typename用法

1.typename的常规用法

typename在C++类模板或者函数模板中经常使用的关键字,此时作用和class相同,只是定义模板参数;

2.typename的第二个用法:模板中标明“内嵌依赖类型名”

template <class T>
 void function()
 {
	T::iterator *iter;
	.....
 }

看到上面这个例子时,我们脑子里可能会有两种想法:

第一:T::iterator *iter,实现乘法,iterator是类T的一个static成员;
第二:定义一个指针,指针指向的类型为T::iterator;

这样的话就会产生异议,由上面的介绍可以知道iterator是类T的静态数据成员,静态成员函数或者是嵌套类型;
当我们这样写的时候,C++默认就是解释为一个变量的。所以,为了和变量区分,必须使用typename告诉编译器。
如果没有修饰关键词typename编译器可能认为我们是想实现乘法运算;若我们的本意是想定义一个指针时,这是就需要typename来修饰,即在T::iterator前面加上关键字typename;

template <class T>
 class myData()
 {
	typename T::iterator *iter;//定义一个指针
	typedef typename iterator_traits<_Iter>::value_type  value _type;//定义一个别名
	.....
 };

typename在下面情况下禁止使用:

  • 模板定义之外,即typename只能用于模板的定义中

  • 基类列表中,比如

    template<class T>
    class Derived: public Base<T>::XXX
    {
    ...
    }
    
  • 构造函数的初始化列表中

如果类型是依赖于模板参数的限定名,那么在它之前必须加typename(除非是基类列表,或者在类的初始化成员列表中)。
所以:

typedef typename iterator_traits<_Iter>::value_type  value _type;

在STL库中有很多例子,如:

在这里插入图片描述

C++20之前,C++语言并没有`export`关键字。而在C++20,`export`关键字被引入用于模板的分离编译。 在C++,模板的定义和实现通常都放在头文件,当使用模板时,编译器需要实例化并编译模板的定义和实现。如果有多个源文件都使用了同一个模板,那么模板的定义和实现就会被重复编译,这会导致编译时间的增加和二进制文件的增大。 通过使用`export`关键字,可以将模板的定义和实现分离开来,将实现部分放在一个单独的源文件,然后在使用模板的源文件通过`import`关键字引入该实现文件,这样就可以避免模板的重复编译,提高编译效率并减小二进制文件的大小。 下面是一个简单的示例: ```C++ // math.hpp export template<typename T> T add(T a, T b) { return a + b; } ``` ```C++ // math.cpp export module math; import <iostream>; export template<typename T> T add(T a, T b) { std::cout << "add() is called" << std::endl; return a + b; } ``` ```C++ // main.cpp import <iostream>; import math; int main() { std::cout << add(1, 2) << std::endl; return 0; } ``` 在上面的示例,`math.hpp`定义了一个`add`函数模板,`math.cpp`实现了`add`函数模板,并使用`export`关键字将其导出为`math`模块。`main.cpp`使用了`import`关键字引入了`math`模块,并调用了`add`函数模板。 需要注意的是,目前并不是所有的编译器都支持`export`关键字,而且`export`关键字的使用也需要遵循一定的规范,具体可以参考C++20的相关文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值