我有一个功能,基本上归结为这个(我正在努力的部分,忽略了实际发生的事情)
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问题。
关于为什么我不能这样做或如何解决它的任何想法?
答案 0 :(得分:2)
这是因为Container中的shared_ptr具有类型std::shared_ptr<Cell>
。您正在将std::shared_ptr<const Cell>
传递给erase()方法。不同种类。您可以通过删除const限定符来修复它。
显然你也可以在这种情况下使用std::const_pointer_cast
。