我遇到了一个小问题,我花了好几个小时解决它,但找不到解决方案。希望你能帮助我。
这是我的类(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 类中的最后一行(通常)匹配此函数调用
最佳答案
问题是你想推导出 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;
}
关于c++ - C++ 模板类中的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25244120/