我已经在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];
}
然而,当我试图把它叫为GetMedian(v, greater<uint32_t>())
,我的编译器(铛)抱怨:
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...
不过,我没有看到这个错误,每当我更改为不使用模板,如:
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];
}
有没有什么办法让我的功能像我想要的那样灵活?
您是否希望模板强制执行提供的比较函数与矢量类型相同,或者如果使用不正确的比较函数会生成编译器错误/警告(如果类型不相同),是否可以使用? – NathanOliver
我怀疑这是一个不可推卸的背景问题。您可以通过显式使用模板参数来解决问题。 'GetMedian(...)'。 –