返回模板向量上的迭代器

Returning an iterator over a template vector

本文关键字:迭代器 向量 返回      更新时间:2023-10-16

我一直在寻找类似的东西,但找不到它(或者我发现的没有帮助)。我试图能够在模板类的向量上有一个迭代器,返回它并在类外使用它,如下面的代码所示。

#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];
}