我正在使用VS 2012的MFC应用程序。在这个应用程序中,我想通过使用Trim()
成员函数清理CString
对象的容器。 首先,我使用了一个std::vector
作为容器,如下面的MCVE所示:
#define _AFXDLL // CString #include <afx.h> // CString #include <vector> int main() { std::vector<CString> v; v.push_back(_T("Test")); v.begin()->Trim(); return 0; }
这个编译和按预期工作。 然后,我想用std::set
replacestd::vector
。 因此,我包含#include <set>
而不是#include <vector>
并更改了main()
,如下所示:
int main() { std::set<CString> s; s.insert(_T("Test")); s.begin()->Trim(); return 0; }
但是,这给了我下面的编译错误s.begin()->Trim();
线:
错误C2663:'ATL :: CStringT >> :: Trim':3重载没有合法的转换'this'指针
错误的文档基本上说:
[…]这个错误可能是由调用一个const对象的非const成员函数引起的。 […]
但是,与vector
版本相比,我没有添加任何const
限定符。 另外, std::set::begin()
提供了一个非常量迭代器,就像std::vector::begin()
一样。 我在错误C2663上find类似的问题,例如这个 。 但是在大多数情况下,有人试图从const
函数中修改一个成员,这在我的代码中并不是这样。
为什么我不能在std::set
CString
对象上使用Trim()
,我该如何解决这个问题?
如何修剪存储在std :: set中的字符串?
你不能,你不应该。 std::set
中的元素在内部排序。 如果你被允许改变他们,这将打破订单。
您最好的选择是从集合中删除现有的项目,并将修改后的项目添加到集合中。