typename使用条件
使用条件:
1.用在模板定义里, 标明其后的模板参数是类型参数。
2.qualified dependent type(修饰-依赖类型)必须使用
1.标明类型参数
与class完全等同
templace<typename T>//templace<class T>
class CTest
{
private:
T t;
public:
//...
}
2.修饰-依赖类型
先来明确这两个概念:
1.修饰(qualified name)。所谓被修饰的名字在语言的一种形式就是通过一个域运算符来表达一个名字。例如std::string就是一个qualified name。如果在某个程序代码中先声明了using std;那么string就不再是qualified name了。
2.依赖(dependent name):在c++语言中,模板通常就是一个dependent name。例如:
template <classT>
class B
{
T a;
B;
}
这种情况下,B就是一个dependent name。因为B类并不独立,B类的具体形式要根据T来决定,B类依赖于T。
矛盾:
#include<iostream>
classA
{
public:
classB
{
public:
B{std::cout<<"A::Bcalled!\n";}
};
static int B;
public:
A{std::cout<<"Acalled!\n";}
};
int main(int argc, char** argv)
{
A a;
typename A::B b;//此处必须声明typename,否则编译错误
}
这个时候typename的作用就是告诉c++编译器,typename后面的字符串为一个类型名称,而不是成员函数或者成员变量,这个时候如果前面没有typename,编译器没有任何办法知道T::LengthType是一个类型class B还是一个成员名称(静态数据成员或者静态函数),所以编译不能够通过。
问题解决:
sLinkList::node *sLinkList::move(int i) const
这句话报错,要求前面加上typename ,这句话是依赖的,同时是修饰的::,所以要加上typename.
https://www.sohu.com/a/120190013_541695
https://www.cnblogs.com/zhangdongsheng/p/9693199.html