从std :: set <shared_ptr <t>&gt;中删除by shared_ptr <const t =“”> </const> </shared_ptr <t>

时间:2011-03-23 05:42:51

标签: c++ set const shared-ptr

我有一个功能,基本上归结为这个(我正在努力的部分,忽略了实际发生的事情)

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 /包括/ C ++ / 4.4 /比特/ shared_ptr.h:651:   错误:来自'const的无效转换   Cell *'到'Cell *'

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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