2015-04-28 210 views
1
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: '无效(__cdecl *)(迭代器,迭代器的std ::以下)':太

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 ::少”:呼叫

如果我试图通过提供它绕过默认参数几个参数伊勒GAL使用这种类型的作为表达

回答

2

默认参数是不是一个函数签名的一部分,所以当你经过一个函数指针间接,正如你在第一个例子做什么,这些信息都将丢失。如果直接在main中用2个迭代器参数调用sort函数,代码将会编译。

在第二个例子中你得到一个编译错误,因为你想,而不是一个实例传递一个类型,以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>> 
//       ^^^^^^^^