【问题标题】:Returning an iterator over a template vector在模板向量上返回一个迭代器
【发布时间】:2011-12-10 06:19:59
【问题描述】:

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

#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.

提前致谢。

【问题讨论】:

  • 不应该是ns::test&lt;int&gt; inters;吗?如果可以帮助,请不要使用using namespace std;
  • 还有,';' 在哪里在你的班级声明之后?这是给你那个错误的实际代码,还是就像给出错误的代码?请复制粘贴(不要重新输入)一个实际的、最小的、完整的程序来演示错误。
  • 我收回我的隐含指控。这是实际代码(由键盘链接证明)。键盘仅显示第一个错误。 @user 会在适当的时候发现其他错误。

标签: c++ templates vector iterator typedef


【解决方案1】:

我遇到的错误与您不同(缺少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;
}

另请参阅:http://codepad.org/gcJBCFOD

【讨论】:

  • 另外,如果你有 typedef,你可以在 beginend 成员函数中使用它
  • 谢谢。我又搜索了一些,几分钟后我偶然发现了“typedef typename”解决方案(也就是说,它缺少 typename,因为 vector 没有实例化 - 对吧?)。对于其他错误(例如缺少';'),我很抱歉,但我确实快速输入了这个示例来说明问题,因为“原始”代码有点难以粘贴。
【解决方案2】:

你需要使用typename:

typedef typename vector<T>::iterator iterator;

typename vector<T>::iterator begin()
typename vector<T>::iterator end()

编辑:
或者只使用你的 typedef:

iterator begin()
iterator end()

【讨论】:

  • 一旦你有了 typedef,你还不如从那里开始使用它。
【解决方案3】:

有很多关于模板和类型名称以及依赖名称here 的讨论。我很难找到那个页面。这是我在那里发布的答案:

显然,当函数不是类成员时,所需的语法略有不同。注意返回类型周围的括号——编译器抱怨没有它们。

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

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 2014-02-15
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多