Удалить из std :: setпо shared_ptr - PullRequest
2 голосов
/ 23 марта 2011

У меня есть функция, которая сводится к этому (часть, с которой я борюсь, игнорируя вещи, которые на самом деле происходят)

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 * ’to‘ Cell * ’

Я думал, что это не должно быть приведение объекта "c" от shared_ptr<const Cell> к shared_ptr<Cell>, но так или иначе это так. Я хочу, чтобы c указывал на const Cell, потому что нет необходимости изменять его. И у CellSorter не должно быть проблем с const.

Есть идеи, почему я не могу это сделать или как это исправить?

1 Ответ

2 голосов
/ 23 марта 2011

Это потому, что shared_ptr в контейнере имеет тип std::shared_ptr<Cell>. Вы передаете std::shared_ptr<const Cell> методу erase (). Различные типы. Вы можете исправить это, удалив константный квалификатор.

Очевидно, вы также можете использовать std::const_pointer_cast в этой ситуации.

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

...