单从字面理解,typename拆分开来type(类型)name(名),可以理解用来说明什么是一个类型。
在写模板时,我们使用T来代表类型,但前面一定需要typename,那是告诉编译器什么是可以替换的。
看一个例子
#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看成是一个类型了。 在这一句这
typename T::Z i;
还要使用typename是说明Z也是一个类型,不然编译器会默认当作一个变量来处理而不是一个类型。
去掉编译报错
../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':
../Template_1/main.cpp:12:9: error: 'i' was not declared in this scope