从 std::set> 中删除通过shared_ptr

发布于 2024-10-24 19:54:00 字数 1254 浏览 1 评论 0 原文

我有一个函数,本质上可以归结为这个(我正在努力解决的部分,忽略实际发生的事情)

class CellSorter
{
public:
    bool operator()( std::shared_ptr<const Cell> a,
                     std::shared_ptr<const Cell> b ) const
    {
        return ( ( a->GetY() < b->GetY() ) ||
                 ( a->GetY() == b->GetY() &&
                   a->GetX() < b->GetX() ) );
    }
};
typedef std::set<std::shared_ptr<Cell>, CellSorter> Container;
MyClass::Container MyClass::DoSomething( std::shared_ptr<const Cell> c )
{
    MyClass::Container N;
    // assume that this code works to copy some stuff to N, blah blah blah
    std::remove_copy_if( _grid.begin(), _grid.end(),
                         std::inserter( N, N.begin() ),
                         std::not1( CellIsNeighbor( c->GetX(), c->GetY() ) ) );
    N.erase( c ); // ERROR
    return N;
};

问题是,gcc 给了我一个错误:

/usr/include/c++/4.4/bits/shared_ptr.h:651: 错误:从 'const 进行无效转换 单元格*' 到 '单元格*'

我认为这不应该将对象“c”从 shared_ptr 转换为 shared_ptr,但不知何故它是。我希望 c 指向 const Cell,因为不需要修改它。 CellSorter 不应该有 const 问题。

关于为什么我不能这样做或如何解决它有什么想法吗?

I have a a function, that essentially boils down to this (the part that I'm struggling with, ignoring the stuff that is actually happening)

class CellSorter
{
public:
    bool operator()( std::shared_ptr<const Cell> a,
                     std::shared_ptr<const Cell> b ) const
    {
        return ( ( a->GetY() < b->GetY() ) ||
                 ( a->GetY() == b->GetY() &&
                   a->GetX() < b->GetX() ) );
    }
};
typedef std::set<std::shared_ptr<Cell>, CellSorter> Container;
MyClass::Container MyClass::DoSomething( std::shared_ptr<const Cell> c )
{
    MyClass::Container N;
    // assume that this code works to copy some stuff to N, blah blah blah
    std::remove_copy_if( _grid.begin(), _grid.end(),
                         std::inserter( N, N.begin() ),
                         std::not1( CellIsNeighbor( c->GetX(), c->GetY() ) ) );
    N.erase( c ); // ERROR
    return N;
};

The problem is, gcc gives me an error:

/usr/include/c++/4.4/bits/shared_ptr.h:651:
error: invalid conversion from ‘const
Cell*’ to ‘Cell*’

I thought that this should not be casting the object "c" from shared_ptr<const Cell> to shared_ptr<Cell>, but somehow it is. I want c to point to a const Cell because there is no need to modify it. And the CellSorter shouldn't have a problem with const.

Any ideas as to why I can't do this or how to fix it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夏の忆 2024-10-31 19:54:00

这是因为Container中的shared_ptr的类型是std::shared_ptr。您正在将 std::shared_ptr 传递给擦除()方法。不同的类型。您可以通过删除 const 限定符来修复它。

显然,在这种情况下你也可以使用 std::const_pointer_cast 。

http://msdn.microsoft.com/en-us/library/bb982336.aspx

It's because the shared_ptr in Container has type std::shared_ptr<Cell>. You are passing a std::shared_ptr<const Cell> to the erase() method. Different types. You can fix it by removing the const qualifier.

Apparently you can also use std::const_pointer_cast in this situation.

http://msdn.microsoft.com/en-us/library/bb982336.aspx

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文