我正在尝试向priority_queue中添加一个具有const成员的结构。
下面是一个很小的例子:
#include <queue>
struct A
{
A(const int& i)
: m_i(i)
{
}
bool operator<(const A& other) const
{
return m_i < other.m_i;
}
const int& m_i;
};
int main()
{
std::priority_queue<A> q;
int i = 3;
const int& f = i;
q.emplace(f);
return 0;
}我理解这方面的错误
错误2错误C2582:‘运算符=’函数在'A‘c:.\算法2322中不可用
我的A没有operator=重载,因为它不能因为const & i。
我有办法让这件事成功吗?
成员需要是一个引用,并且只有const函数可以在这个引用上调用,但是我不介意结构中的值是否被更改。
我试着使用int& const m_i并实现operator=,但之后我无法用const参数初始化emplace (而且我可能还不太明白A& const与const&)是什么。
发布于 2018-06-06 12:17:28
你可以用间接的方法解决这个问题。(优先级)队列要求分配元素。指针是可分配的。因此,队列可以保存指向A对象的指针,而不是保存不可分配的A对象。您可能希望队列拥有这些元素,在这种情况下,您应该使用一个智能指针(代价是为每个元素分配单独的内存)。示例:
std::priority_queue<std::unique_ptr<A>> q;
q.push(std::make_unique<A>(f));另一方面,通过使用指针代替引用,可以轻松地使A可分配。我建议你考虑一下,是否有一个参考成员真的是一个明智的要求。由于一些迫使您拥有引用的原因,std::reference_wrapper (也是可分配的)可能就足够了。
https://stackoverflow.com/questions/50719873
复制相似问题