无法将'const pointer const'传递给const ref
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法将'const pointer const'传递给const ref相关的知识,希望对你有一定的参考价值。
假设你有一组指针(是的......):
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,但不是它指向的东西。
有没有办法顺利解决这个问题(不改变设置的模板类型)?
正如你所说,在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
不会这样做。
为了在有序容器中启用“混合”比较,您可以使用声明类型名称key_compare
的key_compare::is_transparent
类型。
set的默认比较仿函数类是std::less<Key>
。它不是“透明的”。但std::less<void>
是“透明的”,并且只要a
形成良好,就可以对b
和a<b
进行任何论证的比较。所以你可以定义自己的比较函子类型,或者你可以使用std::less<void>
(或等效的std::less<>
):
set<SomeType*,std::less<>> myTypeContainer;
以上是关于无法将'const pointer const'传递给const ref的主要内容,如果未能解决你的问题,请参考以下文章
Qt4 C++ Pointer to const QList of pointers
为啥没有为“T* const”定义pointer_traits?