我几乎成功实现了霍夫曼代码。我遇到错误,错误是这样的:
>>prog.cpp: In function 'int main()':
>>prog.cpp:49:57: error: type/value mismatch at argument 3 in template parameter list for 'template<class _Tp, class _Sequence, class _Compare> class std::priority_queue'
>>priority_queue<Node*,vector<Node*>,comparitor<Node*>> pq;
^
>>prog.cpp:49:57: note: expected a type, got 'comparitor' Node*>
之前我曾尝试过指针,这是我第一次遇到这样的错误。
任何人都可以解释,为什么会出现这样的错误?这是我评论的代码:
#include <iostream>
using namespace std;
#include<queue>
class Node{
public:
int freq;
};
template<typename T>
bool comparitor(T a, T b)
{
if(a->freq>b->freq)
{return true;
}
else{
return false;
} // this is for the min heap
}
int main() {
priority_queue<Node*,vector<Node*>,comparitor<Node*>> pq;// min heap please, comparitor is just for node and not a template, though I could have easily created that.
}
答案 0 :(得分:2)
编译器错误几乎可以给你答案,第三个模板参数应该是一个类型,但你传递一个函数指针。
您需要将comparitor
转换为仿函数:
template<typename T>
struct comparitor
{
bool operator()(T a, T b)
{
if(a->freq>b->freq)
{return true;
}
else{
return false;
} // this is for the min heap
}
};
答案 1 :(得分:2)
std::priority_queue
,需要三个参数 - 都是类型。你传递的是一个功能。将comparitor
更改为具有operator()
功能的课程。
// There is no reason to make it a class template. This is specifically
// designed to work only with Node*
struct comparitor
{
bool operator()(const Node* a, const Node* b) const
{
return (a->freq > b->freq);
}
};
并将其用作:
priority_queue<Node*, vector<Node*>, comparitor> pq;