template<typename Iterator, typename typename Comparator = std::less<typename std::iterator_traits<Iterator>::value_type>>
static void sort(Iterator begin, Iterator end, Comparator cmp = Comparator())
{
...
}
我有以下模板功能:
template<typename func>
static void sort_test(func sort)
{
...
sort(somevector.begin(), somevector.end());
...
}
int main()
{
sort_test(&sort<vector<int, allocator<int>>::iterator>);
return 0;
}
错误C2198:'void(__ cdecl *)(iterator,iterator,std :: less)':调用的参数太少
如果我尝试通过提供它来绕过默认参数:
template<typename func>
static void sort_test(func sort)
{
...
sort(somevector.begin(), somevector.end(), std::less<int>);
...
}
int main()
{
sort_test(&sort<vector<int, allocator<int>>::iterator>,
std::less<int>);
return 0;
}
错误C2275:'std :: less':非法使用此类型作为表达式
答案 0 :(得分:2)
默认参数不是函数签名的一部分,因此当您通过指向函数间接的指针时,正如您在第一个示例中所做的那样,该信息将丢失。如果使用2个迭代器参数直接在sort
内调用main
函数,代码将被编译。
在第二个示例中,您收到编译错误,因为您尝试将类型而不是实例传递给sort
sort(somevector.begin(), somevector.end(), std::less<int>());
typename
sort
template<typename Iterator, typename typename Comparator = std::less<typename std::iterator_traits<Iterator>::value_type>>
// ^^^^^^^^