无法将'const pointer const'传递给const ref

时间:2018-03-01 09:18:26

标签: c++ templates pointers const pass-by-const-reference

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

std::set<SomeType*> myTypeContainer;

然后假设您要从SomeType的const方法中搜索此集:

bool SomeType::IsContainered() const
{
    return myTypeContainer.find(this) != myTypeContainer.end();
}

这不起作用。方法中的this ptr是const SomeType *const,我无法将其放入find。问题是find采用const-ref,在这种情况下,这意味着传递的指针被视为const,但不是它指向的东西。

有没有办法顺利解决这个问题(不改变设置的模板类型)?

2 个答案:

答案 0 :(得分:16)

为了启用&#34;混合&#34;在有序容器中进行比较时,您可以使用声明类型名为key_compare的{​​{1}}类型。

set的默认比较仿函数类是key_compare::is_transparent。它不是透明的&#34;。但std::less<Key>是&#34;透明&#34;只要std::less<void>格式正确,就可以对任何参数ab进行比较。因此,您可以定义自己的比较函数类型,也可以使用a<b(或等效std::less<void>):

std::less<>

答案 1 :(得分:10)

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

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

bool SomeType::IsContainered() const
{
    return myTypeContainer.find(const_cast<SomeType *>(this)) != myTypeContainer.end();
}

如果投射结果不用于修改,那将是安全的;虽然std::set::find不会这样做。