2015-04-01 53 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); 
相关问题