c++ - C++ 模板类中的迭代器

标签 c++ templates iterator

我遇到了一个小问题,我花了好几个小时解决它,但找不到解决方案。希望你能帮助我。

这是我的类(class):

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

};

这是主要的:

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 类中的最后一行(通常)匹配此函数调用

最佳答案

问题是你想推导出 EArray<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;
}

关于c++ - C++ 模板类中的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25244120/

相关文章:

c++ - 将结果与用户输入进行比较 - sqlite3 c++

c++ - 如何在C++中绑定(bind)变量

c++ - 如何访问单元测试静态库的私有(private)成员

javascript - 节奏.js : templated JSON rendering engine does not run javascript when renders items

c++ - CRTP (Curiously Recurring Template Pattern) 使用通用基模板类而不是派生类

c++ - 使用 Typedef 指定模板参数

c++ - 如何在 libav 中使用 PixelFormat 获取像素位数

c++ - 如何正确消除继承的 typedef 的歧义?以及如何缓解他们的创作?

java - 迭代器删除导致 IndexOutOfBoundsException 的第一个元素

python - 获取前一个元素的最pythonic方式