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

1:例子

【转载】c++错误:need ‘typename’ before ‘std::vector::iterator’ because ‘std::vector’ is a dependent scope_第1张图片

编译后提示:

【转载】c++错误:need ‘typename’ before ‘std::vector::iterator’ because ‘std::vector’ is a dependent scope_第2张图片

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

 2:先看下这些概念

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

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

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

3:分析 

首先注意到:

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

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

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

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

4:原因 

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

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

什么意思 ?

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

template<>

class list {

        int  iterator;

}

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

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

5:代码 

【转载】c++错误:need ‘typename’ before ‘std::vector::iterator’ because ‘std::vector’ is a dependent scope_第3张图片

你可能感兴趣的:(C++常见错误,c++,开发语言)