【发布时间】:2013-11-23 02:08:33
【问题描述】:
首先,我有一套
std::set<int*> my_set;
然后,我有一个函数用于检查特定的 int 指针 p 是否存在于 my_set 中,如果指针存在则返回 true,否则返回 false。
由于该函数没有修改引用的int,所以很自然地将指针当成const int*,即
bool exists_in_my_set(const int* p)
{
return my_set.find(p) != my_set.end();
}
但是,当我尝试编译代码时,出现以下错误:
error: invalid conversion from 'const int*' to 'std::set<int*>::key_type {aka int*}' [-fpermissive]
换句话说,当我调用find 时,编译器会尝试将const int* 转换为int*。
无论如何,我的问题是:我怎样才能在my_set 中找到p,或者至少找出p 是否存在于my_set 中,使用p 的现有定义和my_set?
【问题讨论】:
-
std::set<int*>::const_iterator将允许您修改指向的int,因此不应该存在您描述的find重载。这似乎是我使用const_cast的正当理由。 -
我认为你可以使用 const_cast() 暂时摆脱 'const' 属性。
-
没有理由超载
find。你存储int*,表示可以修改引用的对象!?那你为什么要寻找一个不能修改的对象的引用呢? -
也许你的集合应该存储
const int*s? -
@StroyTeller:该函数通过
my_set具有非const访问权限,但由于它不使用该写访问权限,因此它确实接受它是有意义的一个int const*。否则,本身只有int const*的函数需要const_cast才能调用exists_in_my_set。这会产生误导,因为如果exists_in_my_set正确实现,就没有充分的理由将该调用突出显示为潜在的 const-unsafe。因此,在这种情况下,“良好实践”确实提供了正确的方法:它使非修改函数可以从其他人调用而无需强制转换。
标签: c++ templates pointers find constants