我正在尝试在C ++中实现通用堆。为了使它尽可能通用,我试图让堆使用比较器来允许不同类型的堆排序。但是我之前从未使用过比较器,而且我遇到了一个问题。这是我的堆的设置。
template <typename T>
class greater {
public:
bool operator()(const T& a, const T& b) const { return a > b; }
};
template <typename T, typename C = greater<T> >
class heap {
public:
//constructors
heap();
heap(const heap& other);
heap& operator= (const heap& other);
//destructor
~heap();
//operations
void push(const T& datum);
T& peek() const;
void pop();
//status
bool empty() const { return tree.empty(); }
int size() const { return tree.size(); }
//debug
void print() const;
private:
std::vector<T> tree;
//auxilliary functions
int parent(int index) { return (index - 1) / 2; }
int left(int index) { return 2 * index; }
int right(int index) { return 2 * index + 1; }
void swap(int a, int b) {
T temp = tree[a];
tree[a] = tree[b];
tree[b] = temp;
}
void bubble_up(int index);
void bubble_down(int index);
};
但是对于我的bubble_up方法的实现,我得到以下Visual Studio错误:'compare':函数不带2个参数错误代码:C2660 该错误引用了实现中while循环的行,如下所示。
template <typename T, typename C>
void heap<T, C>::bubble_up(int index) {
C compare;
int parent_index = parent(index);
while (compare(tree[parent_index], tree[index]) && parent_index >= 0) {
swap(parent_index, index);
index = parent_index;
parent_index = parent(index);
}
}
我确信我使用比较功能处理得很差,但我很难找到一个明确的解释,为什么这是我的谷歌搜索错误所以任何建议将不胜感激。