У меня довольно странная проблема с реализуемым 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 & other) я забыл добавить после val = other.val; sm = other.sm; линия.
Теперь все работает!