Код №1
#include <iterator>
#include <algorithm>
#include <iostream>
#include <vector>
template <typename container>
void sort(typename container::iterator beginning,
typename container::iterator end)
{
std::cout << "calling custom sorting function\n";
}
int main()
{
std::vector<int> v{1, 2, 3};
sort(v.begin(), v.end());
}
Описание кода
Он будет вызывать функцию std::sort
, которая найдена ADL. Хотя приведенный ниже код:
Код №2
#include <iterator>
#include <algorithm>
#include <iostream>
#include <vector>
template <typename Iterator>
void sort(Iterator beginning,
Iterator end)
{
std::cout << "calling custom sorting function\n";
}
int main()
{
std::vector<int> v{1, 2, 3};
sort(v.begin(), v.end());
}
Вызывает неоднозначную ошибку перегрузки. Поэтому у меня есть два вопроса:
Вопросы
-
Как
container
был выведен в код # 1?Из того, что я знаю, тип дедукции во время создания шаблона не может возвращаться через типы участников, чтобы найти вложенный (
std::vector<int>
в этом случае). -
Даже если он может отступить, почему он скомпилировался, не вызывая неоднозначную ошибку перегрузки?