了解C 中typename的雙重意義

2021-08-20 10:48:04 字數 889 閱讀 2744

typename的最多用法就是模板宣告中,以下兩種宣告沒有任何區別。

template t>

class

test;

template t>

class

test;

typename的另乙個作用就是使用巢狀依賴型別(nested depended name)。

#include 

#include

using

namespace

std;

int p = 10000;

class t ;

int t::iterator = 1;

template

void test(const t& t) ;

int main()

這是一段有歧義的**,模板型別恰好和類型別相同,類型別又有乙個靜態成員函式,又有乙個全域性變數和test函式內部的變數相同。

這段**的本意是類t的靜態成員乘以全域性變數,但是也可以理解為是定義乙個模板型別的迭代器指標。

vs2015下可以編譯通過,但是執行時把p當作指標,由於p沒有初始化,程式崩潰。

由於**有歧義gcc7.3.0/clang5.0.1編譯失敗,提示我使用typename

test.cc:14:15: 錯誤:依賴名『t:: iterator』被解析為非型別,但例項化卻產生了乙個型別

t::iterator *p;

~~~~~~~~~~~~^~

test.cc:14:15: 附註:如果您想指定型別,請使用『typename t:: iterator』

於是加上typename,宣告t::iterator 是乙個型別,把p當作指標變數 小結

條款42 了解typename的雙重意義

條款42 了解typename的雙重意義 includeusing namespace std templatevoid print2nd const c container templatevoid f const c container,不允許使用typename c並不是巢狀 從屬型別名稱,解...

條款42 了解typename的雙重含義

typename在很多種情況下與class是完全相同的,例如下面的使用 1 templame2 3 template 4 條款42 了解typename的雙重含義 1 template2 void print2nd const c containter 310 上面這個式子是無法通過編譯的 這裡的c...

C 中typename和class的區別

在c template中很多地方都用到了typename與class這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢?相信學習c 的人對class這個關鍵字都非常明白,class用於定義類,在模板引入c 後,最初定義模板的方法為 template.在這裡class關鍵字表明t是乙個型別,...