我正在实施的fwd_iterator遇到一个非常奇怪的问题:
如果我在类中定义的方法中使用迭代器,它们可以工作,但是如果我创建一个具有全局作用域的方法,我使用迭代器,valgrind说我试图访问未初始化的内存。
似乎在类外创建的迭代器无法读取类的私有属性(即使使用公共方法创建这样做)。
这是全球范围的方法:
template<typename T, class Pred>
int evaluate(SparseMatrix<T> &sm, Pred pred){
typename SparseMatrix<T>:: iterator begin, end;
int count=0;
begin=sm.begin();
end=sm.end();
while(begin!=end){
if(pred(*(begin->data))) count++;
begin++;
}
int dcount=0;
if(pred(sm.getDef())) dcount = ((sm.getRows() * sm.getCols()) - sm.getSize());
return count+dcount;
}
这是内部类方法:
void print_it() {
iterator x=begin();
iterator y=end();
int i=1;
while(x!=y){
cout<<i<<".("<<(x->i)<<","<<(x->j)<<")="<<*(x->data)<<endl;
++x;
i++;
}
if(x==y) cout<<"End."<<endl;
cout<<endl;
}
解决:迭代器类有两个属性,value_type val和sm,指向类本身的指针。在operator =(const iterator&amp; other)中,我忘了在val = other.val之后添加; sm = other.sm;线。
现在一切正常!
答案 0 :(得分:1)
iterator类有两个属性,value_type val和sm,指向类本身的指针。在operator =(const iterator&amp; other)中,我忘了在val = other.val之后添加; sm = other.sm;线。
现在一切正常!