Оператор ++ из базы CRTP не виден для компилятора - PullRequest
1 голос
/ 18 марта 2019

Возьмем следующий фрагмент кода в качестве примера:

template<class Derived>
struct base {
    Derived operator++(int){
        auto tmp = static_cast<Derived &>(*this);
        ++static_cast<Derived &>(*this);
        return tmp;
    }
};

struct der : public base<der> {
    der &operator++(){
        return *this;
    }
};

int main(){
    der d;
    d++;/// <<< compilation error here
}

Я получаю следующую ошибку от компилятора:

ошибка: нет 'operator ++ (int)', объявленного для postfix '++ '[-fpermissive]

Почему мой постфиксный оператор не виден для компилятора?Содержит ли он какую-то ошибку или это неизвестная мне функция C ++?Можно ли исправить этот код, чтобы постфикс operator++ работал как положено?

Ответы [ 2 ]

3 голосов
/ 18 марта 2019

Ваши две функции имеют одно и то же имя, operator++. Это просто пишется иначе, чем функция с именем с идентификатором. Правило поиска членов класса заключается в том, что по умолчанию, если член с именем обнаружен в производном классе, базовый класс не проверяется. Производный элемент «скрывает» базовый элемент.

Обычный способ избежать сокрытия функции базового класса с другой сигнатурой и позволить разрешению перегрузки выбрать лучшую функцию с помощью объявления-использования:

struct der : public base<der> {
    der &operator++(){
        return *this;
    }
    using base<der>::operator++;
};
1 голос
/ 18 марта 2019

Замените имя operator++ на имя f (то есть попробуйте то же самое с обычной функцией-членом). У вас будет такая же проблема. Компилятор находит именованную функцию в der, поэтому он не выглядит в base<dir>. Перегрузка происходит только среди функций, определенных в той же области.

...