Как я могу дифференцировать перегрузку этих двух операторов? - PullRequest
1 голос
/ 11 октября 2019

Я пытаюсь клонировать класс std :: map в c ++;Я использую std :: vector, который хранит std :: pair. И сейчас я реализую оператор []. Я сделал два определения, одно - const для доступа без изменения, а другое - не const.

При компиляции он говорит, что нет никакой разницы.

Это объявления: Использование этого шаблона:

template<class TClau, class TValor>
TValor& operator[](const TClau& clau);
const TValor& operator[](const TClau& clau);

И вот эти определения:

//m_map is the actual vector with pairs.

template<class TClau, class TValor>
TValor& Map<TClau, TValor>::operator[](const TClau& clau) {
    int l = 0, r = m_length - 1;
    int m;
    if (r >= l) {
        while (r >= l) {
            m = l + (r - l) / 2;
            if (m_map[m] == clau)
                return m_map[m].second;
            if (m_map[m] > clau)
                r = m - 1;

            l = m + 1;
        }
    }
    return TValor;
}

template<class TClau, class TValor>
const TValor& Map<TClau, TValor>::operator[](const TClau& clau) {
    int l = 0, r = m_length - 1;
    int m;
    if (r >= l) {
        while (r >= l) {
            m = l + (r - l) / 2;
            if (m_map[m] == clau)
                return m_map[m].second;
            if (m_map[m] > clau)
                r = m - 1;

            l = m + 1;
        }
    }
    return aux;
}

Я был бы признателен, если бы кто-то мог помочь мне с этим.

1 Ответ

4 голосов
/ 11 октября 2019

Эти операторы отличаются только типом возвращаемого значения.

TValor& operator[](const TClau& clau);
const TValor& operator[](const TClau& clau);

Второй оператор должен быть объявлен с квалификатором const

const TValor& operator[](const TClau& clau) const;

В этом случае объявления операторов различны.

Первый оператор будет вызываться для непостоянного объекта, а второй оператор вызываться для постоянного объекта.

...