在模板向量上返回迭代器

tak*_*are 5 c++ templates iterator typedef 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;
}
Run Code Online (Sandbox Code Playgroud)

(你也可以在这里查看代码: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.
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Rob*_*obᵩ 8

我得到的错误与你不同(遗失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 << "end\n"; // 7th: avoid endl
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

另见:http://codepad.org/gcJBCFOD