从 std::set> 中删除通过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/include/c++/4.4/bits/shared_ptr.h:651: 错误:从 'const 进行无效转换 单元格*' 到 '单元格*'
我认为这不应该将对象“c”从 shared_ptr
转换为 shared_ptr
,但不知何故它是。我希望 c 指向 const Cell,因为不需要修改它。 CellSorter 不应该有 const 问题。
关于为什么我不能这样做或如何解决它有什么想法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是因为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 astd::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