2015-04-01 135 views
0

我正在寫一個模板類,它涉及迭代器的使用。我發現了很多關於如何使用模板來鍵入迭代器的問題,所以我想知道爲什麼它仍然不起作用。typenamed迭代器不是一個類型

#pragma once 

#include <iterator> 
#include <list> 
#include <tuple> 

template <class T> 
class Quack 
{ 
    private: 
     std::list<T> data; 
     typename std::list<T>::iterator iter; 

    public: 
     Quack(); 

     void insert(T dat); 
     std::tuple<T, T> poppop(); 

    private: 
     //error: 'iter' does not name a type 
     iter binarySearch(T toFind, std::list<T>::iterator min, std::list<T>::iterator max); 
}; 

我也試過typedef typename std::list<T>::iterator iter;,但拋出了錯誤「的std ::目錄:: iterator是不是一個類型的」

所以給我使用typename,它是什麼,我米做錯了嗎?

我使用g ++ 4.4.5和參數-std = C++ 0x,如果它是相關的。

回答

7

你想一個typedef有(現在你宣佈一個名爲iter對象):

typedef typename std::list<T>::iterator iter; 

此外,您在binarySearch聲明需要typename

iter binarySearch(T toFind, typename std::list<T>::iterator min, typename std::list<T>::iterator max); 

當然,您可以在此處使用iter

iter binarySearch(T toFind, iter min, iter max); 
+0

我剛剛意識到我沒有沒有使用typedef的權利。然而,當我使用typedef時,我仍然遇到錯誤,就像我提出的問題一樣。 – Yann 2015-04-01 08:59:01

+0

@Yann,是的,更新了。 – jrok 2015-04-01 08:59:54

2

在功能

iter binarySearch(T toFind, std::list<T>::iterator min, std::list<T>::iterator max); 

您指定的私有數據成員ITER作爲函數的返回類型。

typename std::list<T>::iterator iter; 

是具有類型typename std::list<T>::iterator

如果你的意思是類型名稱,而不是數據成員,那麼你應該寫要麼

typedef typename std::list<T>::iterator iter; 
私有數據成員 iter的定義

using iter = typename std::list<T>::iterator; 

此外,它會更好地遵循C++標準中使用的genaral convetion和名稱,如

typedef typename std::list<T>::iterator iterator; 

類型在這種情況下,函數的聲明看起來像

iterator binarySearch(T toFind, iterator min, iterator max); 

而且它是當迭代器位於函數聲明的值的前面時,效果更好

iterator binarySearch(iterator min, iterator max, T toFind);