最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++模板編程中typename用法

 更新時(shí)間:2021年07月07日 10:26:58   作者:Erice_s  
typename在C++類模板或者函數(shù)模板中經(jīng)常使用的關(guān)鍵字,此時(shí)作用和class相同,只是定義模板參數(shù),下面通過例子給大家介紹c++模板typename的具體用法,一起看看吧

typename的常規(guī)用法

typename在C++類模板或者函數(shù)模板中經(jīng)常使用的關(guān)鍵字,此時(shí)作用和class相同,只是定義模板參數(shù);在下面的例子中,該函數(shù)實(shí)現(xiàn)泛型交換數(shù)據(jù),即交換兩個(gè)數(shù)據(jù)的內(nèi)容,數(shù)據(jù)的類型由_Tp決定。

template <typename _Tp>
inline void swap(_Tp& __a, _Tp& __b) 
{
  _Tp __tmp = __a;
  __a = __b;
  __b = __tmp;
}

typename的第二個(gè)用法:修飾類型

限定名和非限定名

​ 限定名(qualified name),是限定了命名空間的名稱??聪旅孢@段代碼,cout和endl是在命名空間std定義的,必須加上std::,使其為std::cout和std::endl,因此稱其為限定名。

#include <iostream>

int main()  
{
    std::cout << "Hello world!" << std::endl;
}

若在主函數(shù)前面使用using namespace std;或者在主函數(shù)內(nèi)使用using std::cout;,然后使用時(shí)只用cout和endl,它們的前面不再有空間限定std::,所以此時(shí)的cout和endl叫做非限定名(unqualified name)。

#include <iostream>
using namespace std;

int main()  
{
    using std::cout;
	using std::endl;
	cout << "Hello world!" << endl;
}

依賴名和非依賴名

依賴名(dependent name)是指依賴于模板參數(shù)的名稱,而非依賴名(non-dependent name)則相反,指不依賴于模板參數(shù)的名稱??聪旅孢@段代碼:

template <class T>
class MyClass 
{
     int i;
     vector<int> vi;
     vector<int>::iterator vitr;
  
     T t;
     vector<T> vt;
     vector<T>::iterator viter;
 };

因?yàn)閕nt是內(nèi)置類型,前三個(gè)定義的類型在聲明這個(gè)模板類時(shí)就已知,叫做非依賴名。然而對(duì)于接下來的三行定義,只有在模板實(shí)例化時(shí)才能知道它們的類型,因?yàn)樗鼈兌家蕾囉谀0鍏?shù)T。則T, vector<T>, vector<T>::iterator稱為依賴名。

類作用域

在類外部訪問類中的名稱時(shí),可以使用類作用域操作符,調(diào)用通常存在三種:靜態(tài)數(shù)據(jù)成員、靜態(tài)成員函數(shù)和嵌套類型:Metadata::value,Metadata::function,Metadata::ValueType;

 class Metadata {
     static int value;
     static int function();
     typedef std::string ValueType;
 };

下面來看一個(gè)例子:

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

我們可能本意是想定義一個(gè)迭代器對(duì)象,例如我們?nèi)绻胿ector來實(shí)例化這個(gè)模板,那么iter
則應(yīng)該是一個(gè)迭代器指針,但是,如果我們用下面這個(gè)類來實(shí)例化這個(gè)模板

class cType
{
    static int iterator;
    ...
};

/* 
T::iterator *iter會(huì)被編譯器解釋為兩個(gè)數(shù)相乘。事實(shí)上,C++編譯器會(huì)采用第二種解釋方法,即使iterator的確是一個(gè)類型名。
為了避免這種矛盾,當(dāng)我們適用qualified dependent name的時(shí)候,需要用typename來指出這是一個(gè)類型名.即: typename T::iterator *iter;
typename 指出下面緊跟著的名稱是一個(gè)類型
*/
template <typename T> class Y
{
    typename T::iterator *iter;
    typedef typename T::iterator iterator; //定義了Y::iterator類型名稱
    ...
};

T::iterator這種名稱,由于iterator具體是類型還是成員變量取決于T的類型實(shí)現(xiàn),所以當(dāng)我們知道T::iterator是個(gè)類型名稱時(shí),如果我們要使用這個(gè)類型名,前面必須要加typename.

typename使用規(guī)則

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

  1. 模板定義之外,即typename只能用于模板的定義中
  2. 非限定類型,比如int,vector<int>之類
  3. 基類列表中,比如template <class T> class C1 : T::InterType不能在T::InterType前面加typename
  4. 構(gòu)造函數(shù)的初始化列表中,如果類型是依賴于模板參數(shù)的限定名,那么在它之前必須加typename(除非是基類列表,或者在類的初始化成員列表中)。

到此這篇關(guān)于詳解C++模板編程中typename用法的文章就介紹到這了,更多相關(guān)c++模板typename內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中vector容器的常用操作方法實(shí)例總結(jié)

    C++中vector容器的常用操作方法實(shí)例總結(jié)

    vector容器一般被用作創(chuàng)建動(dòng)態(tài)數(shù)組,動(dòng)態(tài)數(shù)組就像Python中的list結(jié)構(gòu)一樣,可以比普通數(shù)組擁有更豐富操作方法,下面就為大家整理了一些最常用的操作:
    2016-05-05
  • C++實(shí)現(xiàn)簡單的圖書管理系統(tǒng)

    C++實(shí)現(xiàn)簡單的圖書管理系統(tǒng)

    本文給大家分享的是使用C++實(shí)現(xiàn)簡單的圖書管理系統(tǒng)的代碼,本系統(tǒng)采用了面向?qū)ο蟮某绦蛟O(shè)計(jì)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-08-08
  • 利用C++求絕對(duì)值的幾種方法例子

    利用C++求絕對(duì)值的幾種方法例子

    相信大家在學(xué)習(xí)C++時(shí),應(yīng)該都有做過求絕對(duì)值的題目,下面這篇文章主要給大家介紹了關(guān)于利用C++求絕對(duì)值的幾種方法例子,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • C/C++后端學(xué)習(xí)與練習(xí)深入

    C/C++后端學(xué)習(xí)與練習(xí)深入

    這篇文章主要介紹了C/C++對(duì)于后端的學(xué)習(xí)與練習(xí),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C++插入排序算法實(shí)例

    C++插入排序算法實(shí)例

    這篇文章主要介紹了C++插入排序算法實(shí)例,本文先是講解了什么插入排序,然后給出了C++代碼實(shí)例,需要的朋友可以參考下
    2014-10-10
  • C++ Boost log日志庫超詳細(xì)講解

    C++ Boost log日志庫超詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • Qt開發(fā)之獲取電腦磁盤容量

    Qt開發(fā)之獲取電腦磁盤容量

    項(xiàng)目中用到了監(jiān)測(cè)某磁盤(如:C盤、D盤等)的總?cè)萘亢涂捎萌萘?,查了一下,發(fā)現(xiàn)其實(shí)挺簡單,本文就來用QT實(shí)現(xiàn)這一功能吧,希望對(duì)大家有所幫助
    2023-04-04
  • 解析如何在C語言中調(diào)用shell命令的實(shí)現(xiàn)方法

    解析如何在C語言中調(diào)用shell命令的實(shí)現(xiàn)方法

    本篇文章是對(duì)如何在C語言中調(diào)用shell命令的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中繼承基類與派生類的區(qū)別

    C++中繼承基類與派生類的區(qū)別

    這篇文章主要介紹了C++中繼承基類與派生類的區(qū)別,面向?qū)ο蟪绦蛟O(shè)計(jì)中最重要的一個(gè)概念是繼承。繼承允許我們依據(jù)另一個(gè)類來定義一個(gè)類,這使得創(chuàng)建和維護(hù)一個(gè)應(yīng)用程序變得更容易,需要的朋友可以參考下
    2023-05-05
  • 用C語言實(shí)現(xiàn)鏈?zhǔn)綏=榻B

    用C語言實(shí)現(xiàn)鏈?zhǔn)綏=榻B

    大家好,本篇文章主要講的是用C語言實(shí)現(xiàn)鏈?zhǔn)綏=榻B,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評(píng)論

建水县| 莱西市| 贡山| 景宁| 红桥区| 汝城县| 远安县| 朔州市| 和林格尔县| 横峰县| 淅川县| 汶上县| 莒南县| 梨树县| 文化| 阿拉善盟| 泰顺县| 永修县| 长白| 吉安县| 固阳县| 通江县| 姜堰市| 邢台县| 抚州市| 盐山县| 巩义市| 西和县| 龙岩市| 浪卡子县| 昌宁县| 休宁县| 布拖县| 柏乡县| 昔阳县| 满洲里市| 威远县| 勐海县| 浪卡子县| 景东| 宁晋县|