typename区分类型与static成员

使用类的类型成员

我们通过(::)来访问static成员和类型成员.

在普通函数中,编译器掌握类的定义,因此,它知道通过作用域访问符访问的是名字还是static成员.

但对于模板代码,如T::mem它不会知道men是一个类型成员还是一个static数据成员,知道实例化时才知道.

T::size_type * p;

编译器需要知道我们是正在定义名为p的变量还是将一个名为size_typestatic数据成员与名为p的变量相乘.

如果我们希望使用一个模板类型参数的类型成员,就必须显示告诉编译器该名字是一个类型.我们通过关键字typename来实现:

template <template T>
typename T::value_type top(const T& c) {
    if (!c.empty()) return c.back();
    else return typename T::value_type();
}

top函数期待一个容器类型的实参,它使用typename指明其返回类型.

当我们希望通知编译器一个名字表明类型时,必须使用关键字 typename 而不是 class

posted @ 2021-04-05 23:55  phr2000  阅读(109)  评论(0编辑  收藏  举报