代码#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>
在这种情况下)。即使它可以回溯,为什么编译时不会导致模糊的重载错误?