无法为std :: less / std :: greater实例化binary_function

时间:2012-10-20 00:27:46

标签: c++ algorithm data-structures stl functional-programming

我正在尝试编写一个函数来打印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

1 个答案:

答案 0 :(得分:4)

您是object slicing的受害者。

当您将less<T>greater<T>分配给binary_function类型时,他们定义的operator()就会消失。

来自my favorite reference

  

binary_function没有定义operator();期望派生类将定义此。 binary_function只提供三种类型 - first_argument_type,second_argument_type和result_type - 由模板参数定义。

您应该直接传递less<T>greater<T>。您也可以使用pointer_to_binary_function,但它们都已在C ++ 11中弃用,而不是function