2015-04-28 419 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>> 
//       ^^^^^^^^