首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >const member&> - 'operator =‘函数不可用的member&>

const member&> - 'operator =‘函数不可用的member&>
EN

Stack Overflow用户
提问于 2018-06-06 11:58:40
回答 1查看 49关注 0票数 1

我正在尝试向priority_queue中添加一个具有const成员的结构。

下面是一个很小的例子:

代码语言:javascript
复制
#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&)是什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-06 12:17:28

你可以用间接的方法解决这个问题。(优先级)队列要求分配元素。指针是可分配的。因此,队列可以保存指向A对象的指针,而不是保存不可分配的A对象。您可能希望队列拥有这些元素,在这种情况下,您应该使用一个智能指针(代价是为每个元素分配单独的内存)。示例:

代码语言:javascript
复制
std::priority_queue<std::unique_ptr<A>> q;
q.push(std::make_unique<A>(f));

另一方面,通过使用指针代替引用,可以轻松地使A可分配。我建议你考虑一下,是否有一个参考成员真的是一个明智的要求。由于一些迫使您拥有引用的原因,std::reference_wrapper (也是可分配的)可能就足够了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50719873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档