我有一点问题,我正在研究它几个小时但找不到解决方案。希望你能帮助我。
这是我的班级:
#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类中的最后一行(通常)匹配此函数调用
答案 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“类型?”