我正在尝试编写一个函数来打印minheap和maxheap的内容,但是我遇到了比较器的问题。我尝试使用三元运算符,但它不起作用,因为std :: less和std :: greater是不同的类型。我如何尝试使用比较器有什么问题?
#include <functional>
template<typename T> void printheap (T* v, int begin, int end, bool max) {
end--;
std::binary_function<T,T,bool> comp;
if (max) comp = less<T>();
else comp = greater<T>();
while (end>=begin) {
cout << v[begin] << " ";
pop_heap(&v[begin], &v[end+1], comp );
end--;
}
cout << endl;
}
链接错误:
/usr/include/c++/4.6/bits/stl_heap.h:305:4: error: no match for call to ‘(std::binary_function<int, int, bool>) (int&, int&)’
编辑:
我也尝试过使用binary_function指针并在堆上分配,现在我得到了一个不同的错误:
template<typename T> inline void printheap (T* v, int begin, int end, bool max) {
...
std::binary_function<T,T,bool> *comp;
if (max) comp = new less<T>();
else comp = new greater<T>();
...
pop_heap(&v[begin], &v[end+1], (*comp) );
...
delete comp;
}
错误:
/usr/include/c++/4.6/bits/stl_heap.h:305:4: error: ‘__comp’ cannot be used as a function
答案 0 :(得分:4)
您是object slicing的受害者。
当您将less<T>
或greater<T>
分配给binary_function
类型时,他们定义的operator()
就会消失。
binary_function没有定义operator();期望派生类将定义此。 binary_function只提供三种类型 - first_argument_type,second_argument_type和result_type - 由模板参数定义。
您应该直接传递less<T>
或greater<T>
。您也可以使用pointer_to_binary_function
,但它们都已在C ++ 11中弃用,而不是function
。