typename使用条件

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值