无法将 'const pointer const' 传递给 const ref
Can't pass 'const pointer const' to 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 *
(即指针到non-const),这是find
.
的预期参数类型
您可以使用 const_cast
执行显式转换。
bool SomeType::IsContainered() const
{
return myTypeContainer.find(const_cast<SomeType *>(this)) != myTypeContainer.end();
}
如果不使用转换结果进行修改,那将是安全的;而 std::set::find
不会那样做。
为了在有序容器中启用 "mixed" 比较,您可以使用声明类型名称 key_compare::is_transparent
.
的 key_compare
类型
set 的默认比较函子 class 是 std::less<Key>
。它不是 "transparent"。但是 std::less<void>
是 "transparent" 并执行任何参数 a
和 b
的比较,只要 a<b
格式正确。所以你可以定义你自己的比较仿函数类型或者你可以使用 std::less<void>
(或等效的 std::less<>
):
set<SomeType*,std::less<>> myTypeContainer;
假设您有一组指针(是的...):
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 *
(即指针到non-const),这是find
.
您可以使用 const_cast
执行显式转换。
bool SomeType::IsContainered() const
{
return myTypeContainer.find(const_cast<SomeType *>(this)) != myTypeContainer.end();
}
如果不使用转换结果进行修改,那将是安全的;而 std::set::find
不会那样做。
为了在有序容器中启用 "mixed" 比较,您可以使用声明类型名称 key_compare::is_transparent
.
key_compare
类型
set 的默认比较函子 class 是 std::less<Key>
。它不是 "transparent"。但是 std::less<void>
是 "transparent" 并执行任何参数 a
和 b
的比较,只要 a<b
格式正确。所以你可以定义你自己的比较仿函数类型或者你可以使用 std::less<void>
(或等效的 std::less<>
):
set<SomeType*,std::less<>> myTypeContainer;