无法从指针(Node *)类型转换为const指针(const Node *&)

无法用指针(Node *)类型转换为const指针(const Node *&)。在以下代码中:
struct Node
{
	int val;
	int index;
	Node(){}
	Node(int v, int i) :val(v), index(i){}
};

struct CompareNode
{
	bool operator()(const Node *&lhs,const Node *&rhs)const
	{
		return lhs->val > rhs->val;
	}
};

void f()
{
	priority_queue<Node*, vector<Node *>, CompareNode> q;
	for (int i = 0; i < 10; ++i)
	{
		q.push(&Node(i, i + 1));
	}
}

编译代码时,会出现错误:无法将参数 1 从“Node *”转换为“const Node *&”,因为Node* p,表示指针p可变,指针p所指的对象也可变,而const Node *&q,表示指针q可变,但是指针q所指向的对象不可变。我们无法从“Node *p”转换为"const Node *&q",(1)假设p可以转换q,q是p的引用,即q是p的一个别名,p指向的对象是个非const对象,但是q指向的对象是个const对象,一个对象不可能同时是const对象和非const对象。所以编译器不允许从“Node *p”转换为"const Node *&q。传递给bool operator()(const Node *&lhs,const Node*&rhs)const,我们的目的是保证指针不可变,而不是保证指针所指向的对象不可变,所以函数bool operator()(const Node *&lhs,const Node *&rhs)const应该改写为bool operator()(Node *const &lhs,Node *const &rhs)const。也可改写成bool operator()(const Node *const &lhs,const Node *const &rhs)const。代码如下:
struct Node
{
	int val;
	int index;
	Node(){}
	Node(int v, int i) :val(v), index(i){}
};

struct CompareNode
{
	bool operator()(const Node *const &lhs,const Node *const &rhs)const 
	{
		return lhs->val > rhs->val;
	}
};

void f()
{
	priority_queue<Node*, vector<Node *>, CompareNode> q;
	for (int i = 0; i < 10; ++i)
	{
		q.push(&Node(i, i + 1));
	}
}


                
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值