I have defined the following function in C++:
template<class Type> Type GetMedian(const vector<Type>& items, function<bool(Type, Type)> comp) {
vector<Type> copied_items(items);
std::nth_element(copied_items.begin(), copied_items.begin() + copied_items.size()/2, copied_items.end(), comp);
return copied_items[copied_items.size()/2];
}
However, when I try to call it as GetMedian(v, greater<uint32_t>()), my compiler (clang) complains:
error: no
matching function for call to 'GetMedian'
GetMedian(v, greater<uint32_t>());
^~~~~~~~~
note:
candidate template ignored: could not match 'function' against 'greater'
template<class Type> Type GetMedian(const vector<Type>& items, function...
However, I do not see this error, whenever I change to not use templates, as:
uint32_t GetMedian(const vector<uint32_t>& items, function<bool(uint32_t, uint32_t)> comp) {
vector<uint32_t> copied_items(items);
std::nth_element(copied_items.begin(), copied_items.begin() + copied_items.size()/2, copied_items.end(), comp);
return copied_items[copied_items.size()/2];
}
Is there any way to make my function as flexible as I am trying to?