【发布时间】:2023-03-12 01:38:01
【问题描述】:
我有一个成员变量std::set<T*> m_associates;,即非常量原始指针的集合,我只想检查另一个指针是否存在。
为了保持 const 的正确性,我的函数如下所示:
bool MyClass::is_associated(const T* x) const
{
return (m_associates.find(x) != m_associates.end());
}
但是,这不会编译,因为x 被作为const T* 传递,表明x 指向的值没有被函数更改,但m_associates 包含非const T*。
如果我从 x 参数中删除 const,它会编译,但会违反 const 正确性...
将const 添加到m_associates,即std::set<const T*> m_associates; 也不是一个选项,因为我需要在我的班级的其他地方使用非常量指针。
我该如何解决这个问题?这是(可能是唯一的)应该使用const_cast 的点吗?还是我必须始终将所有参数 T 指针作为非常量传递?
编辑: 完整的错误输出,编译器是clang++-8,代码是C++17
error: no matching member function for call to 'find'
return (m_associates.find(x) != m_associates.end());
~~~~~~~~~~~~^~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_set.h:798:7: note: candidate function not viable: 1st argument ('const T *') would lose const qualifier
find(const key_type& __x) const
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_set.h:804:2: note: candidate function template not viable: 'this' argument has type 'const std::set<T *>', but method is not marked const
find(const _Kt& __x)
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_set.h:794:7: note: candidate function not viable: 'this' argument has type 'const std::set<T *>', but method is not marked const
find(const key_type& __x)
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_set.h:810:2: note: candidate template ignored: substitution failure [with _Kt = const T *]: no matching member function for call to '_M_find_tr'
find(const _Kt& __x) const
^
【问题讨论】:
-
这里添加 const 应该没有问题。你绝对不应该违反 const-correcteness。
-
您从发布的代码中得到什么错误?
-
您使用的是哪个版本的 C++?如果您在
std::set上使用透明比较器,C++14 及更高版本将允许此操作 -
使用C++17和clang++-8,我将错误输出添加到正文中
标签: c++ const-correctness