关键字typename

                   单从字面理解,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模板


       加上以后就能够声明和实例化一个对象,就是不想被编译器当成变量处理的类型前面都加上typename
相关文章
相关标签/搜索