我正在使用VS 2012处理MFC应用程序。在此应用程序中,我想使用CString
成员函数清理Trim()
个对象的容器。首先,我使用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::vector
替换std::set
。因此,我添加#include <set>
代替#include <vector>
并更改了main()
,如下所示:
int main()
{
std::set<CString> s;
s.insert(_T("Test"));
s.begin()->Trim();
return 0;
}
但是,这会在s.begin()->Trim();
行上给出以下编译错误:
错误C2663:&#39; ATL :: CStringT&gt;&gt; ::修剪&#39; :3个超载没有法律转换,因为这个&#39;指针
documentation of the error基本上说:
[...]此错误可能是由于在const对象上调用非const成员函数引起的。 [...]
但是,与vector
版本相比,我没有添加任何const
限定符。此外,std::set::begin()
提供非const
迭代器,就像std::vector::begin()
一样。我在错误C2663上找到了类似的问题,例如this一个。但是在大多数情况下,有人试图从const
函数修改成员,而我的代码却不是这样。
为什么我不能Trim()
CString
std::set
A
对象上使用y = A x
?如何解决此问题?
答案 0 :(得分:2)
如何修剪存储在std :: set中的字符串?
你不能也不应该。 std::set
中的元素在内部排序。如果您被允许更改它们,那将破坏顺序。
您最好的选择是从集合中删除现有项目,并将修改后的项目添加到集合中。