Компилирование следующего кода
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);
компилируется без ошибок. Это может быть связано с различными правилами перегрузки для функций, не являющихся членами, о которых я не знаю, я не уверен
Итак, мои вопросы:
- Почему именно эта перегрузка не разрешена?
- Почему размещение их в глобальном пространстве имен позволяет их компилировать?