假设T是一个类模板的模板参数,当编译器遇到类似T::size_type这样的代码时,它不会知道size_type是一个自定义的类型还是类的静态成员变量,直到实例化时才会知道。例如,在类模板的某个成员函数中有如下代码
-
template<typename T>
-
void MyClass<T>::MyFunc()
-
{
-
T::size_type* pszit_type;
-
}
此时,如果将size_type看作是类的静态成员变量,则以上语句为size_type乘以psize_type;而如果将size_type看作是类自定义的类型,则以上语句的作用是声明了一个size_type的指针pszit_type。
在默认情况下,C++编译器认为是第一种情况,即将size_type看作是类的静态成员变量。如果希望C++编译器将size_type看作是类自定义的类型,则需要显式地告诉编译器该名字是一个类型,通过typename来实现这一点:
-
template<typename T>
-
void MyClass<T>::MyFunc()
-
{
-
typename T::size_type* pszit_type;