Я думаю, вы сами сформулировали проблему:
в глобальном пространстве имен
Функции в глобальном пространстве имен считаются последними. Это самая внешняя сфера по определению . Любая функция с тем же именем (не обязательно применимо), которая находится в более близкой области (с точки зрения вызова), будет выбрана первой.
template <typename Rng, typename T>
typename Rng::iterator find( Rng& rng, T const& t );
namespace foo
{
bool find(std::vector<int> const& v, int);
void method()
{
std::deque<std::string> deque;
auto it = find(deque, "bar");
}
}
Здесь (если только vector
или deque
включают algorithm
, что разрешено), единственный метод, который будет выбран при поиске имени, будет:
bool foo::find(std::vector<int> const&, int);
Если algorithm
каким-то образом включен, также будет:
template <typename FwdIt>
FwdIt std::find(FwdIt begin, FwdIt end,
typename std::iterator_traits<FwdIt>::value_type const& value);
И, разумеется, разрешение перегрузки не будет установлено, если совпадение не найдено.
Обратите внимание, что поиск по имени чрезвычайно туп: ни арность, ни тип аргумента не учитываются!
Следовательно, в C ++ есть только два вида свободных функций:
- Те, которые являются частью интерфейса класса, объявленного в том же пространстве имен, подобранного ADL
- Те, которые не являются, и которые вы должны явно квалифицировать, чтобы избежать проблем этого типа
Если вы нарушите эти правила, это может сработать или нет, в зависимости от того, что включено, и это очень неловко.