首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能将“const指针const”传递给const ref

不能将“const指针const”传递给const ref
EN

Stack Overflow用户
提问于 2018-03-01 09:18:25
回答 2查看 1.2K关注 0票数 12

假设您有一组指针(是的.):

代码语言:javascript
复制
std::set<SomeType*> myTypeContainer;

然后假设您想从SomeType的const方法中搜索这个集合:

代码语言:javascript
复制
bool SomeType::IsContainered() const
{
    return myTypeContainer.find(this) != myTypeContainer.end();
}

这不管用。方法中的this ptr是一个const SomeType *const,我不能将它放入find中。问题是find接受一个const,在本例中这意味着传递的指针被视为const,而不是它所指向的东西。

是否有一种方法可以顺利地解决这个问题(而不改变设置的模板类型)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-01 09:23:57

如前所述,在const成员函数this变成const SomeType * (即指向const的指针)中,它不能隐式转换为SomeType * (即指向非const的指针),这是find的预期参数类型。

您可以使用const_cast执行显式转换。

代码语言:javascript
复制
bool SomeType::IsContainered() const
{
    return myTypeContainer.find(const_cast<SomeType *>(this)) != myTypeContainer.end();
}

如果不使用强制转换结果进行修改,这将是安全的;而std::set::find则不会这样做。

票数 10
EN

Stack Overflow用户

发布于 2018-03-01 10:32:07

为了在有序容器中启用“混合”比较,可以使用声明typename key_compare::is_transparentkey_compare类型。

集合的默认比较函式类是std::less<Key>。它不是“透明的”。但std::less<void>是“透明的”,只要ab格式良好,就可以对任何参数进行比较。因此,您可以定义自己的比较函子类型,也可以使用std::less<void> (或等效的std::less<>):

代码语言:javascript
复制
set<SomeType*,std::less<>> myTypeContainer;
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49046357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档