Я занимаюсь университетским проектом на C ++, целью которого является научиться использовать разные контейнеры STL и их итераторы.
В моей программе есть класс с набором:
class ConjuntoDeLetras{
private:
set<Letra> letras;
public:
ConjuntoDeLetras();
···
};
Внутри класса у меня есть два вложенных класса: итератор и const_iterator. (Я не знаю, является ли это лучшим способом создания итераторов классов, но учитель говорит нам, что нам нужно делать таким образом):
class iterator{
private:
set<Letra>::iterator it;
public:
iterator();
Letra operator*();
ConjuntoDeLetras::iterator& operator++();
ConjuntoDeLetras::iterator& operator+=(int num);
bool operator==(const ConjuntoDeLetras::iterator &i);
bool operator!=(const ConjuntoDeLetras::iterator &i);
friend class ConjuntoDeLetras;
};
class const_iterator{
private:
set<Letra>::const_iterator it;
public:
const_iterator();
Letra operator*();
ConjuntoDeLetras::const_iterator& operator++();
ConjuntoDeLetras::const_iterator& operator+=(int num);
bool operator==(const ConjuntoDeLetras::const_iterator &i);
bool operator!=(const ConjuntoDeLetras::const_iterator &i);
friend class ConjuntoDeLetras;
};
Оба метода класса итератора работают хорошо. В ConjuntoDeLetras
классе у нас есть методы начала и конца:
ConjuntoDeLetras::iterator begin();
ConjuntoDeLetras::const_iterator begin() const;
ConjuntoDeLetras::iterator end();
ConjuntoDeLetras::const_iterator end() const;
Проблема здесь. Когда я собираюсь использовать const_iterator, у нас возникают проблемы:
ConjuntoDeLetras::const_iterator itL;
for(itL=L.begin(); itL!=L.end(); ++itL){
CantidadLetras aux;
aux.frecuenciaAbsoluta = 0;
aux.frecuenciaRelativa = 0;
aux.letra = (*itL).getLetra();
salida.push_back(aux);
}
Когда я выполняю этот код, компилятор говорит, что у меня нет operator=
для const_iterator для итератора. Я знаю причину проблемы, потому что объект L
не является константной переменной и использует обычные итераторы begin()
и end()
. Я думал об удалении последней константы функций, но я не могу перегрузить функцию только типом возвращаемого значения. Я не знаю, какое решение лучше. Вот ошибка компилятора:
error: no match for ‘operator=’ (operand types are ‘ConjuntoDeLetras::const_iterator’ and ‘ConjuntoDeLetras::iterator’)
for(itL=L.begin(); itL!=L.end(); ++itL){
^
И та же ошибка с end()
.