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

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

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

typename的常規(guī)用法

typename在C++類模板或者函數(shù)模板中經(jīng)常使用的關(guān)鍵字,此時作用和class相同,只是定義模板參數(shù);在下面的例子中,該函數(shù)實現(xiàn)泛型交換數(shù)據(jù),即交換兩個數(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的第二個用法:修飾類型

限定名和非限定名

​ 限定名(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;,然后使用時只用cout和endl,它們的前面不再有空間限定std::,所以此時的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;
 };

因為int是內(nèi)置類型,前三個定義的類型在聲明這個模板類時就已知,叫做非依賴名。然而對于接下來的三行定義,只有在模板實例化時才能知道它們的類型,因為它們都依賴于模板參數(shù)T。則T, vector<T>, vector<T>::iterator稱為依賴名。

類作用域

在類外部訪問類中的名稱時,可以使用類作用域操作符,調(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;
 };

下面來看一個例子:

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

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

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

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

T::iterator這種名稱,由于iterator具體是類型還是成員變量取決于T的類型實現(xiàn),所以當我們知道T::iterator是個類型名稱時,如果我們要使用這個類型名,前面必須要加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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

    利用C++求絕對值的幾種方法例子

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

    C/C++后端學習與練習深入

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

    C++插入排序算法實例

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

    C++ Boost log日志庫超詳細講解

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

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

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

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

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

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

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

    用C語言實現(xiàn)鏈式棧介紹

    大家好,本篇文章主要講的是用C語言實現(xiàn)鏈式棧介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評論

开阳县| 绥德县| 洛隆县| 南部县| 靖江市| 江永县| 福州市| 龙岩市| 长海县| 宁晋县| 犍为县| 丰宁| 周至县| 清新县| 龙江县| 永仁县| 沐川县| 广西| 德钦县| 贵溪市| 祁连县| 文成县| 商南县| 巴彦县| 历史| 永仁县| 中卫市| 札达县| 神木县| 华池县| 鄂伦春自治旗| 山东省| 西宁市| 富锦市| 灯塔市| 虞城县| 清涧县| 苍梧县| 陕西省| 新和县| 轮台县|