【转载】c++错误:need ‘typename’ before ‘std::vector::iterator’ because ‘std::vector’ is a dependent scope

1:例子

编译后提示:

 关键提示信息:[Error] need ‘typename’ before ‘std::vector::iterator’ because ‘std::vector’ is a dependent scope

 2:先看下这些概念

模板:模板不是 函数也不是类,它并不是一个可以拿来使用的实在对象,也就是没有实体用来根据你给 它的类型参数帮你生成一个实体对象。

模板实例化:给模板以类型参数后,模板创建实例对象的过程。

模板特化(具化):针对某些特定的具体类型,对模板 进行修改,使其对于该类型的实例对象有不同的行为。

3:分析 

首先注意到:

list<int>::iterator it    ----是可以编译通过的。

list<T>::iterator  it    ------这是不可以编译通过的。

这两个关键的区别在于 vector<int>  是实例化之后的一个实在的类型,而 vector<T>还是一个模板类型,它如何实例化还需要取决于外部实际传进来的参数类型 T 。

所以,正如编译器的错误提示 : because ‘std::vector’ is a dependent scope, 其中 dependent scope, 就指出了这个 类型还 需要依赖 别的条件,也就是传进来的类型参数,这个和上面分析的一样。

4:原因 

但是为什么编译器不能直接根据模板类型的定义来实现这个声明了?

原因在于编译器无法识别: std:: list<T>::iterator 这个名称是一个成员变量还是一个类型。

什么意思 ?

因为假如 list这个类被特化了,在 list类中定义这样 的代码

template<>

class list<int> {

        int  iterator;

}

那么:std::list<int>::iterator 这个名称就是 一个成员变量,再把它当做类型 就不能在适用了。

所以 :为了防止出现这样的歧义,正如 编译器提示的,需要 在  std::list<T>::iterator的前面添加关键字 typename 来显示的说明它是一个类型而非 成员变量。

5:代码 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值