Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
定义用于优先级队列的自定义比较器 我想在C++中实现一个用于char []缓冲区的MIHHAP,并且AM在执行时面临一些问题。我对优先级队列的声明如下(我不确定这是否会给我一个maxHeap或minHeap):_C++ - Fatal编程技术网

定义用于优先级队列的自定义比较器 我想在C++中实现一个用于char []缓冲区的MIHHAP,并且AM在执行时面临一些问题。我对优先级队列的声明如下(我不确定这是否会给我一个maxHeap或minHeap):

定义用于优先级队列的自定义比较器 我想在C++中实现一个用于char []缓冲区的MIHHAP,并且AM在执行时面临一些问题。我对优先级队列的声明如下(我不确定这是否会给我一个maxHeap或minHeap):,c++,C++,而TcpPacket::getBytes是: struct comparePacketContents { bool operator()(char lhs[], char rhs[]) const { return atoi(TcpPacket::getBytes(lhs, 0, SEQUENCE_SIZE)) < atoi(TcpPacket::getBytes(rhs, 0, SEQUENCE_SIZE)); } }; char* TcpPacket::getByt

TcpPacket::getBytes
是:

struct comparePacketContents {
  bool operator()(char lhs[], char rhs[]) const {
    return atoi(TcpPacket::getBytes(lhs, 0, SEQUENCE_SIZE)) < atoi(TcpPacket::getBytes(rhs, 0, SEQUENCE_SIZE));
  }
};
char* TcpPacket::getBytes(char* buf, int start, int size) {
  char* ans = (char *) malloc(sizeof(char)*size);
  for (int i = 0; i < size; i++) {
    *(ans + i) = *(buf + start + i);
  }
  return ans;
}
它给了我以下错误:

no instance of overloaded function "std::priority_queue<_Ty, _Container, _Pr>::push [with _Ty=char [], _Container=std::vector<char [], std::allocator<char []>>, _Pr=comparePacketContents]" matches the argument list
argument types are: (char [2048])
object type is: std::priority_queue<char [], std::vector<char [], std::allocator<char []>>, comparePacketContents>
重载函数“std::priority_queue::push[with _Ty=char[],_Container=std::vector,_Pr=comparePacketContents]”的实例与参数列表不匹配
参数类型为:(char[2048])
对象类型为:std::priority\u队列
如何解决此错误?

您可能可以通过执行
push(&buf)
将指针显式推送到数组的开头来“修复”编译错误。否则,编译器会认为您想要推送整个数组,而容器会保存指针(
char[]
类似于
char*

但这可能还不足以解决所有问题,因为您似乎正在存储指向C样式字符串的原始指针,而没有正确管理这些分配。相反,考虑编写一个类来保存您的数据包:

class Packet {
public:
    Packet(const char* data); // takes ownership of data

    uint32_t seqnum() const; // similar to existing implementation
    // ...

private:
    std::shared_ptr<char> m_data;
};

Packet::Packet(const char* data) : m_data(data, free) {
}

bool operator<(const Packet& lhs, const Packet& rhs) {
    return lhs.seqnum() < rhs.seqnum();
}

priority_queue<Packet> receiveBuffer;
类数据包{
公众:
数据包(const char*data);//拥有数据的所有权
uint32_t seqnum()const;//与现有实现类似
// ...
私人:
std::共享的ptr m_数据;
};
数据包::数据包(常量字符*数据):m_数据(数据,免费){
}

bool运算符作为旁注,您的代码充满内存泄漏。我强烈建议使用
std::string
代替
char[]
。当您使用它调用
push()
时,
buf
的类型是什么?@JohnZwinck
char[2048]
您建议的修改即使在正确编译方面也不起作用。。另外,我基本上使用的是返回c风格字符串的网络缓冲区。。你会建议我应该如何改变(这是我第一次使用C字符串,我很感激你在这方面的帮助)@ Ak希JAIN:我已经更新了我的答案,并对如何在C++中更简洁地使用这些缓冲区做了更详细的介绍。
no instance of overloaded function "std::priority_queue<_Ty, _Container, _Pr>::push [with _Ty=char [], _Container=std::vector<char [], std::allocator<char []>>, _Pr=comparePacketContents]" matches the argument list
argument types are: (char [2048])
object type is: std::priority_queue<char [], std::vector<char [], std::allocator<char []>>, comparePacketContents>
class Packet {
public:
    Packet(const char* data); // takes ownership of data

    uint32_t seqnum() const; // similar to existing implementation
    // ...

private:
    std::shared_ptr<char> m_data;
};

Packet::Packet(const char* data) : m_data(data, free) {
}

bool operator<(const Packet& lhs, const Packet& rhs) {
    return lhs.seqnum() < rhs.seqnum();
}

priority_queue<Packet> receiveBuffer;