无法将“const指针const”传递给const引用

12

假设你有一组指针(没错...):

std::set<SomeType*> myTypeContainer;

现在假设你想要在一个SomeType类的const方法中搜索这个集合:

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

这样行不通。在该方法中,this 指针是 const SomeType *const 类型的,我无法将其放入 find 中。问题在于 find 接受 const 引用,在这种情况下意味着传递的指针被视为 const,但它指向的对象不是。

有没有一种方法可以平滑解决这个问题(而不改变 set 模板类型)?


升级到C++14:http://en.cppreference.com/w/cpp/container/set/find(参见3或4) - Caleth
5
@Caleth ...并相应地更改“Compare”类型,例如std::set<SomeType*,std::less<>> - Arne Vogel
2个回答

16
为了在有序容器中启用“混合”比较,您可以使用一个声明了类型名key_compare::is_transparentkey_compare类型。
set的默认比较函数类是std::less<Key>。它不是“透明”的。但是,std::less<void>是“透明”的,只要a<b格式正确,它就可以对任何参数ab进行比较。因此,您可以定义自己的比较函数类型,或者使用std::less<void>(或等效的std::less<>)。
set<SomeType*,std::less<>> myTypeContainer;


1
两种解决方案都有各自的优缺点。我接受了上面的答案,因为它解决了我的特定问题。感谢您提供了另一种选择! - Thomas B.

10
正如您所说,在const成员函数中,this变为const SomeType *(即指向常量的指针),它不能隐式转换为SomeType *(即指向非常量的指针),而find的期望参数类型是SomeType *(即指向非常量的指针)。
您可以使用const_cast进行显式转换。
bool SomeType::IsContainered() const
{
    return myTypeContainer.find(const_cast<SomeType *>(this)) != myTypeContainer.end();
}

如果转换结果不用于修改,那么使用强制类型转换是安全的;而std::set::find则不会这样做。


2
@songyanyao 我认为使用 const_cast 是不必要的,我在我的回答中描述了一种更加流畅的替代方案。 - Oliv
1
吹毛求疵:this 的类型是 const SomeType*(不是一个常量指针)。 - bogdan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接