C++ STL中使用范围解析运算符的困惑

C++ STL中使用范围解析运算符的困惑,c++,stl,C++,Stl,这是: vector <int>::iterator arrIterator = intArray.begin (); vector::迭代器arrIterator=intArray.begin(); 在这两种情况下,我并不完全清楚作用域解析操作符(:)是如何使用的。在这些示例中,value和iterator的值分别是如何确定的?在tuple\u size::value的情况下,value是在tuple\u size结构中定义的变量。::的意思类似于“查找tuple\u size

这是:

vector <int>::iterator arrIterator = intArray.begin ();
vector::迭代器arrIterator=intArray.begin();

在这两种情况下,我并不完全清楚作用域解析操作符(:)是如何使用的。在这些示例中,value和iterator的值分别是如何确定的?

tuple\u size::value
的情况下,
value
是在
tuple\u size
结构中定义的变量。
::
的意思类似于“查找tuple\u size结构中定义的名称值”

这同样适用于
vector::iterator
迭代器
向量
类中定义

您可能会感到困惑,因为示例中的两个外部类型都指定了模板参数。查看
vector
示例,这使迭代器(在vector类中定义)知道它将迭代的类型。这就是为什么
iterator
首先在
vector
中定义的原因


对于
tuple\u size::value,这是tuple中的参数数<代码>值
在这种情况下是整数,取决于模板参数,因此它还必须在元组类中定义。

范围解析运算符仅指定在何处查找名称。因此
tuple\u size::value
意味着在类
tuple\u size
中查找名称
value
。范围解析不关心名称表示什么,它只处理在哪里查找

使用名称的位置决定了该名称是否有效

在第一种情况下,它在声明中用作初始值设定项,因此它必须命名一个有效的值,如果它不有效,编译器会抱怨。在第二种情况下,在声明中使用它来命名类型(
iterator
)。同样,一旦编译器检查声明并知道它应该是一个类型,它就可以检查它是否确实是一个类型

当然,这只是一个小小的简化。在模板的定义中,如果这些名称依赖于模板参数,则其含义可能会发生变化。因此,我们必须明确指定我们希望这些名称是什么,具体如下。

tuple\u size和
vector
都是模板类。模板参数
tupleType
int
是类定义的一部分,这意味着一个
vector
就是一个完全不同的类

这就是为什么必须包含它们来解析范围


最后,它与访问一个简单的类成员(如
class::member

)没有什么不同。在这两种情况下,限定名都用于命名类模板专门化的成员。这可以用来命名静态类成员。此外,类定义或类模板定义中可能会出现
typedef
或使用
别名的
,并且类型别名被视为类的成员

std::tuple\u size::value
是一个静态成员(指定tuple类型中的元素数量)
std::vector::iterator
是一种成员类类型(该类型的对象可用于迭代向量的元素)

例如:

template <typename T> class A
{
public:
    static const int value = 3;
    typedef int number_type;
    using param_type = T;
    using container_type = std::vector<T>;
};

int main() {
    int a = A<int>::value;          // a is initialized to 3
    A<int>::number_type n = 0;      // n is an int
    A<int>::param_type p = 1;       // p is an int
    A<double>::param_type q = 2.5;  // q is a double
    A<double>::container_type v;    // v is a std::vector<double>
}
模板类别A
{
公众:
静态常数int值=3;
typedef int number_type;
使用param_type=T;
使用容器_type=std::vector;
};
int main(){
int a=a::value;//a被初始化为3
A::number_type n=0;//n是一个int
A::param_type p=1;//p是一个int
A::param_type q=2.5;//q是双精度的
A::container_type v;//v是std::vector
}

(如示例所示,类模板的成员可以依赖于模板参数。)

这两个元素分别存在于每个类
tuple_size
vector
中。
tuple\u size::value
的值取决于该实现,我猜它是在声明
tupleType
时提取的。对于vector,该值是用
intArray.begin()
赋值的。是的,混淆与模板有关。迭代器是哪种类型的成员?
vector::迭代器是一个类。(可能是一个typedef)。哦,对了,那么这里的向量就是名称空间?@Sadiq-不,向量是一个类,而不是名称空间。类和名称空间都有作用域。它是类中的一个类,或“成员类”。