返回模板向量上的迭代器
Returning an iterator over a template vector
我一直在寻找类似的东西,但找不到它(或者我发现的没有帮助)。我试图能够在模板类的向量上有一个迭代器,返回它并在类外使用它,如下面的代码所示。
#include <iostream>
#include <vector>
using namespace std;
namespace ns {
template <class T>
class test {
private:
vector<T> container;
public:
typedef vector<T>::iterator iterator;
vector<T>::iterator begin() {
return container.begin();
}
vector<T>::iterator end() {
return container.end();
}
}
};
int main(void) {
test<int> inters;
for (ns::test<int>::iterator i = inters.begin(); i != inters.end(); i++) {
// bla bla bla
}
cout << "end" << endl;
return 0;
}
(你也可以在这里查看代码:http://codepad.org/RuXCYF6T)
我在第15行得到以下错误:
error: type '__gnu_debug_def::vector<_Tp, std::allocator<_CharT> >' is not derived from type 'ns::test<T>'
compilation terminated due to -Wfatal-errors.
我得到的错误与你不同(缺少typename
,缺少;
,缺少ns::
)。显然,不同的错误消息来自不同版本的GCC。您在g++ 4.1.2下运行此程序。我使用g++ 4.6.1。
在修复了所有的错误之后,这对我来说是有效的:
#include <iostream>
#include <vector>
using namespace std;
namespace ns {
template <class T>
class test {
private:
vector<T> container;
public:
typedef typename vector<T>::iterator iterator; // first change: add typename
typename vector<T>::iterator begin() { // 2nd: add typename
return container.begin();
}
typename vector<T>::iterator end() { // 3rd: add typename
return container.end();
}
}; // 4th: add semi
} // 5th: delete semi
int main(void) {
ns::test<int> inters; // 6th: add ns::
for (ns::test<int>::iterator i = inters.begin(); i != inters.end(); i++) {
// bla bla bla
}
cout << "endn"; // 7th: avoid endl
return 0;
}
参见:http://codepad.org/gcJBCFOD
您需要使用typename
:
typedef typename vector<T>::iterator iterator;
和
typename vector<T>::iterator begin()
typename vector<T>::iterator end()
编辑:
或者直接使用typedef:
iterator begin()
iterator end()
这里有很多关于模板、类型名和依赖名称的讨论。我好不容易才找到那页。以下是我张贴在那里的答案:
显然,当函数不是类成员时所需的语法略有不同。注意返回类型周围的圆括号——没有圆括号编译器会报错。
template<typename T> (typename std::vector<T>::iterator)
someNonMemberFunction(std::vector<T>& vec, const T& val)
{ return [some std::vector<T>::iterator to an element in vec];
}
相关文章:
- 使用迭代器时如何访问对象在向量中的位置?
- 在 C++ 向量构造中包含迭代器
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- C++迭代器和向量
- 在无法访问向量的情况下查找迭代器的末尾
- C++ 向量插入和迭代器混淆
- 如何在C++中仅使用迭代器正确迭代 3D 向量?
- C++结构编译器错误询问向量的迭代器
- 为什么迭代器没有到达向量末端?
- 如何使用迭代器填充未知大小的向量?
- C++如何为向量向量构建迭代器
- 如何使用迭代器指向结构体c++的向量
- std::向量迭代器和调整大小/保留的奇怪/有趣行为
- 在C++中使用带有自定义向量的迭代器
- 使用条件迭代器插入到向量中
- 如何取消引用向量迭代器
- 如何从给定另一个迭代器向量的向量中删除元素
- 为什么迭代器向量::插入在填充后无效:迭代器插入(const_iterator位置,size_type n,常量value_type和val);
- C++ - 迭代器向量未编译的迭代器
- 对迭代器向量的重载<<