Функция-член не может быть перегружена для ввода итераторов набора и const_iterator (но может быть использована для других итераторов stl) - PullRequest
0 голосов
/ 29 августа 2018

Компилирование следующего кода

struct foo {
    int foo(std::set<int>::iterator);
    int foo(std::set<int>::const_iterator);
};

Я получаю следующую ошибку от gcc (mingw)

func.cpp:5:9: error: 'int functor::foo(std::set<int>::const_iterator)' cannot be overloaded
    int foo(std::set<int>::const_iterator);

func.cpp:4:9: error: with 'int functor::foo(std::set<int>::iterator)'
    int foo(std::set<int>::iterator);

и я получаю похожие ошибки от msvc и clang. Я думаю, проблема в том, что они представляют один и тот же тип поскольку в std :: set члены являются постоянными. Это подтверждается тем фактом, что замена set на vector приводит к отлично скомпилирован.

странно, когда я удаляю функции из структуры и помещаю их в глобальное пространство имен

int foo(std::set<int>::iterator);
int foo(std::set<int>::const_iterator);

компилируется без ошибок. Это может быть связано с различными правилами перегрузки для функций, не являющихся членами, о которых я не знаю, я не уверен

Итак, мои вопросы:

  • Почему именно эта перегрузка не разрешена?
  • Почему размещение их в глобальном пространстве имен позволяет их компилировать?

1 Ответ

0 голосов
/ 29 августа 2018

В глобальном контексте это просто объявление одной и той же функции (когда оба итератора имеют одинаковый тип).

int foo(std::set<int>::iterator);
int foo(std::set<int>::const_iterator);

В классе нельзя объявлять дважды один и тот же метод.

Если вы определяете функции:

int foo(std::set<int>::iterator) {return 0;}
int foo(std::set<int>::const_iterator) {return 0;} // program is ill formed (when iterator are same type)

Вы нарушаете ODR (одно правило определения) с двумя определениями одной и той же функции (и, вероятно, имеете дублированную ошибку символа с компоновщиком).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...