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是乙個型別,...