c++类迭代器实用程序:定义和用法
C++ class iterator utility: definition and usage
我有一个名为A
的类,在这个类中我有一个可迭代的容器,我按照一些访问规则——顺序、空性和其他规则对其进行迭代。
class A {
public:
class iterator {
public:
// Constructor
iterator() {
}
// Destructor
~iterator() {
}
// Advances the iterator
void operator++() {
// Some accessing policy
}
};
private:
std::vector<int> a;
};
一切都工作得非常好——看起来非常整洁——除了,当我声明我的迭代器时,我必须使用typename
——我几乎认为这是为了告诉编译器我拥有的是一个类型,而不是一个类实例化本身。
问题:
为什么我必须使用
typename
时,我做:A a; for (typename A::iterator it(...); it != ...; ++it) { }
迭代器通常是如何定义的,因为vector迭代器不需要
typename
标签?它是否必须从类定义中声明向量,而不是从向量本身?std::vector<int> v; for (std::vector<int>::iterator it(v.begin()); it != v.end(); ++it) { }
迭代器是在容器类中定义的吗?——我猜它被命名为composition——或者,如果不是,它是如何将迭代器添加到类的命名空间中的,如:
std::vector<int>::iterator it;
1 -为什么我必须使用
typename
当我做:[…]
您不必使用typename
。当您使用依赖的限定类型名称时,在模板中需要typename
消歧器。这个关于StackOverflow的问答澄清了一些事情。:
A a;
typename a::iterator it; // ERROR!
是非法的 c++。如果A
不是模板参数的名称,您应该这样做:
A::iterator it;
如果在模板中,A
是模板参数的名称,例如:
template<typename A>
struct X
{
void foo()
{
typename A::iterator it;
// ^^^^^^^^
// This is necessary here!
}
};
那么你必须使用typename
来告诉编译器::
后面的是类型的名称。
同样," vector迭代器不需要2 -既然vector迭代器不需要
typename
标记,那么迭代器通常是如何定义的?
typename
标记"也不是真的。如果您有该向量的显式专门化,例如:
std::vector<int>::iterator it; // "typename" not required
则不需要typename
,因为A::iterator it
中不需要。但是,如果您在模板中,就像下面的情况一样,则需要:
template<typename A>
struct X
{
void foo()
{
typename std::vector<A>::iterator it;
// ^^^^^^^^
// This is necessary here!
}
};
这是因为std::vector<A>::iterator
在这里是一个限定的、依赖的类型名。
3 -迭代器是在容器类内部定义的吗?——我猜它被命名为composition——或者,如果不是,它是如何将迭代器添加到类的命名空间中,如[..]
这可以通过定义一个嵌套类来实现,或者简单地通过使用类型别名来实现:
template<typename T>
struct X
{
typedef T* iterator;
iterator begin() { /* ... */ }
// ...
};
X<int>::iterator it; // OK: "typename" not required
template<typename T>
void foo(X<T>& x)
{
typename X<T>::iterator it = x.begin();
// ^^^^^^^^
// This is necessary here!
// ...
}
你的示例代码有很多问题,所以这可能是你正在寻找的答案(挥手):)当然,如果你的示例不正确,那么所有的赌注都是关闭的。
我很惊讶这竟然能起作用。'a'是一个变量,'a'是类。
同样,当使用默认构造函数声明变量时,不要使用结束括号()。
A a;
A::iterator it;
for (A::iterator it; it != ...; ++it) {
}
同样,迭代器在容器类中定义。只有在处理模板时才需要使用typename,并且只有在访问可以解释为静态成员或函数/嵌套类或typedef的东西时才需要使用typename。这可以通过Andy Prowl给出的答案进一步解释。
好运- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- 简单的类用法+未定义的引用
- 定义其他名称空间的少量用法可以吗
- 结构定义中的 typedef 用法
- 类型不完整:定义前的类用法与前向声明
- 私有类型定义的公共用法是可移植的
- c++类迭代器实用程序:定义和用法