有的时候我们会在类中通过typedef或using声明一个子类型:
class A{
public:
using Str = string;
};
如果在模板中直接使用该类的子类型会报错:
#include <iostream>
#include <string>
using namespace std;
template<class T>
void doTest(T t)
{
T::Str s = "hello";
}
int main()
{
A a;
doTest(a);
return 0;
}
这是因为模板不知道T::Str这种写法是类T的一个子类型还是类T的一个成员,此时需要通过typename对该子类型进行一下声明:
#include <iostream>
#include <string>
using namespace std;
class A{
public:
using Str = string;
};
template<class T>
void doTest(T t)
{
typename T::Str s = "hello";
}
int main()
{
A a;
doTest(a);
return 0;
}
通过typename T::Str告诉编译器Str是T的一个子类型。