我有一个包含std ::具有名称的对象集的类。名称用于对集合中的对象进行排序。我可以通过名称找到集合中的对象,但我不能使用std :: set :: find()返回的迭代器来修改它们 我尝试时代码编译失败,如下所示:
class cTestObject
{
public:
cTestObject( const string& name )
: myName( name )
{
}
void Add( int i )
{}
void constAdd( int i ) const
{}
bool operator<( const cTestObject& m2) const
{
return myName < m2.myName;
}
private:
string myName;
};
class cTestContainer
{
public:
void Method();
private:
set < cTestObject > mySet;
};
void cTestContainer::Method()
{
// declare set iterator which is NOT constant
std::set<cTestObject>::iterator it;
it = mySet.find( cTestObject("test") );
if( it != mySet.end() )
{
it->constAdd( 1 ); // compiles OK
it->Add( 1 ); // fails to compile
}
}
编译器说:
error: passing 'const cTestObject' as 'this' argument
of 'void cTestObject::Add(int)' discards qualifiers [-fpermissive]|
正如重复问题的接受答案所说:&#34;你不能&#34;#34;而是复制对象,修改它,擦除原始对象,并插入修改后的副本。像这样:
cTestObject T( *it );
T.Add( 1 );
mySet.erase( it );
mySet.insert( T );