#include <functional>
#include <algorithm>
#include <vector>
template<typename Iterator>
void test(Iterator begin, Iterator end, std::function<void (Iterator, Iterator)> func)
{
}
template<typename Iterator>
void mysort(Iterator begin, Iterator end)
{
}
int main()
{
std::vector<int> data;
test(data.begin(), data.end(), std::sort<std::vector<int>::iterator>);
test(data.begin(), data.end(), mysort<std::vector<int>::iterator>);
return 0;
}
Первый вызов функции test компилируется, второй — нет, сообщение об ошибке:
test.cpp: В функции «int main()»:
test.cpp:19:67: ошибка: нет соответствующей функции для вызова «test(std::vector<int>::iterator, std::vector<int>::iterator, <unresolved overloaded function type>)»
test(data.begin(), data.end(), mysort<std::vector<int>::iterator>);
^
test.cpp:19:67: замечание: candidate is:
test.cpp:6:6: замечание: template<class Iterator> void test(Iterator, Iterator, std::function<void(Iterator, Iterator)>)
void test(Iterator begin, Iterator end, std::function<void (Iterator, Iterator)> func)
^
test.cpp:6:6: замечание: template argument deduction/substitution failed:
test.cpp:19:67: замечание: mismatched types «std::function<void(Iterator, Iterator)>» and «void (*)(__gnu_cxx::__normal_iterator<int*, std::vector<int> >, __gnu_cxx::__normal_iterator<int*, std::vector<int> >)»
test(data.begin(), data.end(), mysort<std::vector<int>::iterator>);
^
test.cpp:19:67: замечание: could not resolve address from overloaded function «mysort<std::vector<int>::iterator>»
test.cpp: In instantiation of «void test(Iterator, Iterator, std::function<void(Iterator, Iterator)>) [with Iterator = __gnu_cxx::__normal_iterator<int*, std::vector<int> >]»:
test.cpp:18:70: required from here
test.cpp:6:6: предупреждение: параметр «begin» не используется [-Wunused-parameter]
void test(Iterator begin, Iterator end, std::function<void (Iterator, Iterator)> func)
^
template<typename _RandomAccessIterator>
inline void
sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
Заставить код компилироваться можно, например, так:
test<std::vector<int>::iterator>(data.begin(), data.end(), mysort<std::vector<int>::iterator>);
Но почему в случае std::sort происходит разворачивание шаблона нормально, а в случае mysort нет?
gcc 4.8.2