stl — C ++ итератор при ошибке списка

Я имею в классе C ++ следующее:
Я хочу использовать итератор, чтобы иметь элемент списка вопросов одновременно, вызывая функцию getNextQuestion () после проверки, действителен ли итератор, вызывая isValid (). Это дает мне следующую ужасную ошибку:

passing ‘const iterator {aka const std::_List_iterator<domain::Question>}’ as ‘this’ argument of ‘std::_List_iterator<_Tp>::_Self&
std::_List_iterator<_Tp>::operator++() [with _Tp = domain::Question,std::_List_iterator<_Tp>::_Self =
std::_List_iterator<domain::Question>]’ discards qualifiers [-fpermissive]

#ifndef TESTREPOSITORY_H_
#define TESTREPOSITORY_H_

#include <iostream>
#include <iterator>
#include <list>
#include <algorithm>
#include <fstream>
#include "../domain/question.h"
using namespace domain;

namespace repository{
template<class T>
class TestRepository{
std::string file;
std::list<T> questions;
typename std::list<T>::iterator it;
public:
TestRepository(std::string& file=""):file(file){
this->questions = this->getQ();
this->it = this->questions.begin();
};

std::list<T> getQ() const{
std::list<T> listq;
using namespace std;
string line;
std::ifstream fin(file.c_str());
while(fin.good()){
Question q;
fin >> q;
listq.push_back(q);
}
fin.close();
return listq;
}

const bool isValid() const{
return this->it != this->questions.end();
}

const T getNextQuestion() const{
T q = (*this->it);
++this->it;
return q;
}

};
}

#endif /* TESTREPOSITORY_H_ */

Вот код, где я называю эти функции, может быть, вот в чем проблема:

#include "TestController.h"#include "../domain/test.h"#include <iostream>
#include <list>
#include <iterator>

namespace controller{

TestController::TestController(repository::TestRepository<domain::Question>* repo,int   testId){
this->repo = repo;
this->testId = 0;
}

const test TestController::getCurrentTest() const{
test test(this->testId,0,0);
return test;
}

const bool TestController::isValid() const{
return this->repo->isValid();
}

const Question TestController::getNextQuestion() const{
return this->repo->getNextQuestion();
}}

0

Решение

Вы пытаетесь изменить участника в const Функция-член, которая запрещена (это точка функций-констант const):

const T getNextQuestion() const{
T q = (*this->it);
++this->it;   // << Here
return q;
}

Этот метод должен быть неконстантным, или рассмотреть возможность использования вашего итератора-члена mutable :

mutable typename std::list<T>::iterator it;
0

Другие решения

Вот:

const T getNextQuestion() const{
T q = (*this->it);
++this->it;
return q;
}

Вы меняете поле it и вы не должны, потому что метод const, Если вы хотите использовать const только в том смысле, что ваш «репозиторий» не изменен, но его внутренний итератор не имеет значения, вы можете использовать mutable ключевое слово:

mutable typename std::list<T>::iterator it;
1

По вопросам рекламы [email protected]