單從字面理解,typename拆分開來type(類型)name(名),能夠理解用來講明什麼是一個類型。ios
在寫模板時,咱們使用T來表明類型,但前面必定須要typename,那是告訴編譯器什麼是能夠替換的。this
看一個例子spa
#include <iostream> using namespace std; template <typename T> class X { public: X() {} void f() const { i.f(); } private: typename T::Z i; }; class Y { public: Y() {} class Z { public: Z() {} void f() const { cout << "Hello World!" << '\n'; } }; }; int main() { X<Y> t; t.f(); return 0; }
開始已經告訴了編譯器將T當作是一個類型了。 在這一句這code
typename T::Z i;
對象
還要使用typename是說明Z也是一個類型,否則編譯器會默認看成一個變量來處理而不是一個類型。編譯器
去掉編譯報錯io
../Template_1/main.cpp:15:18: error: need 'typename' before 'T::Z' because 'T' is a dependent scope編譯
../Template_1/main.cpp: In member function 'void X<T>::f() const':function
../Template_1/main.cpp:12:9: error: 'i' was not declared in this scope模板