簡體   English   中英

在模板向量上返回迭代器

[英]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:: typename 顯然,不同的錯誤消息來自不同版本的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

您需要使用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];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM