我收到以下代码的编译错误:
#include <set>
#include <string>
using namespace std;
struct string_with_set_of_strings
{
string str;
set< string > strs;
string_with_set_of_strings(string s) : str(s) {}
bool operator < (const string_with_set_of_strings & swsos) const { return str < swsos.str; }
};
int main()
{
set< string_with_set_of_strings > A;
pair< set< string_with_set_of_strings >::iterator, bool> it = A.insert(string_with_set_of_strings("foo"));
if (!it.second)
it.first->strs.insert("goo");
return 0;
}
这是错误消息(来自Visual Studio 2017):
error C2663 : 'std::_Tree<std::_Tset_traits<_Kty,_Pr,_Alloc,false>>::insert' : 5 overloads have no legal conversion for 'this' pointer
with
[
_Kty = std::string,
_Pr = std::less<std::string>,
_Alloc = std::allocator<std::string>
]
它是指我尝试插入“ goo”的行。我意识到it.second将等于true,因为第一次插入A将成功,因此在运行时甚至不会遇到“ goo”行,但这不能解释编译器错误。我不知道为什么第二次插入不被编译器接受。任何帮助表示赞赏。
答案 0 :(得分:1)
您不能修改集合的元素,因此会出错。
换句话说,std :: set的元素是const
,因此不可变。
此外,当compiling时,错误应显示如下内容:
note: passing 'const std::set<std::__cxx11::basic_string<char> >*'
as 'this' argument discards qualifiers
在what happens when you modify an element of an std::set?中阅读更多内容