我见过代码
vector<char> v(10);
vector<char>::iterator p;
这里需要vector<char>::
。这是否意味着迭代器是向量命名空间中的一个类?
答案 0 :(得分:4)
是否意味着迭代器是向量命名空间内的一个类?
不完全是vector
类模板中的类型。迭代器不仅取决于容器的类型(这里是vector
),还取决于迭代的元素类型(这里是char
)。
答案 1 :(得分:2)
可能最简单的方法是理解::
是范围运算符,而不仅仅是命名空间。
std::vector<char>
是一个类,因此它有自己的类范围(C ++ 03中为3.3.6,C ++ 11中为3.3.7)。 std::vector<char>::iterator
是该范围内的完全限定名称。在iterator
的情况下,它命名一个类型 - 不一定是类,即使它本身也不一定在std::vector<char>
中定义,因为iterator
可能是一个typedef
碰巧,类范围不是C ++称之为“命名空间”的东西之一。在日常[*]英语中,您可以将其描述为一种命名空间,它只不是C ++中的正确术语。
但是,无论如何,请注意它是vector<char>
哪个是类,并且其范围包含iterator
,而不是vector
。 std::vector
确保任何vector<T>
都具有iterator
类型,但对于其他模板,并不一定每个特化都具有相同的成员和嵌套类型。所以没有vector
范围。
[*]“每天”,如果您的日子是那些谈论名称空间的人的日子。
答案 2 :(得分:1)
是的,它确实意味着那个。 Iterator在类vector
的范围内定义,并且对于每个不同的类型创建vector
,迭代器也有不同的实现。
答案 3 :(得分:1)
这也意味着迭代器在vector<char>
而不是vector<int>
上运行。
答案 4 :(得分:0)
命名空间无法进行模板化,因此向量不能是命名空间。 实际上,vector是一个模板类(而vector是一个实例化),迭代器是一个嵌套类型。
但问题有一点:A :: B语法通常无法区分。在名称解析方面,如果是事实,两个类的名称空间都是......名称的容器。
类不仅仅是名称容器:它们代表具有实例和相关功能的数据。 命名空间只是名称的容器