c ++模板类中的迭代器

时间:2014-08-11 13:12:08

标签: c++ templates iterator

我有一点问题,我正在研究它几个小时但找不到解决方案。希望你能帮助我。

这是我的班级:

#include <iostream>
#include <iterator>

template <typename T> class Array{
private:
    size_t size;
    T *newArray;

public:
    class Iterator:public std::iterator<std::output_iterator_tag, T>{
        T *p;
        public:
            Iterator(T*x):p(x){}
            T& operator*() {return *p;}

    };

    Array (size_t size = 10): size(size), newArray(new T[size]){};
    Iterator begin(){return (Iterator(newArray));}

    T printBegin(typename Array<T>::Iterator it){ return *it;}

    template <typename E>
    T printBegin(typename Array<E>::Iterator it){ return (T)*it;}

};

这是Main:

using namespace std;

int main(){

    Array<int> x;
    Array<int> y;
    cout << y.printBegin(x.begin()); // prints 0 OK

    Array<double> p;
    // cout << p.printBegin(x.begin());

    return 0;
}

第一个cout工作正常,但评论的行表示:error: no matching function for call to ‘Array<double>::printBegin(Array<int>::Iterator)’

我不明白,因为我的Array类中的最后一行(通常)匹配此函数调用

2 个答案:

答案 0 :(得分:1)

问题在于,您希望从E Array<E>::Iterator推导出x.begin() Array<int>::Iterator。但这根本不可能。

你最好的选择可能是写:

template <typename IT>
T printBegin(IT it){ return (T)*it;}

如果出于任何原因需要使用E类型,那么最好添加嵌套的typedef:

class Iterator:public std::iterator<std::output_iterator_tag, T>{
    public:
        typename T array_member_type;
        //...
};

然后:

template <typename IT>
T printBegin(IT it){
    typedef typename IT::array_member_type E;
    return (T)*it;
}

等待!您的迭代器派生自std::iterator,因此typedef已经存在。无需重新定义:

template <typename IT>
T printBegin(IT it){
    typedef typename IT::value_type E;
    return (T)*it;
}

答案 1 :(得分:0)

您的问题与另一个关于模板扣除的问题非常类似。

编译器无法从E中扣除Array<E>::Iterator类型。它为什么能够?两种不同的类型E可以共享相同的迭代器类型。

你真正对编译器说的是:

Array<E>::Iterator是否为此类型的”E“类型?”