如何从std :: set :: find()修改迭代器指向的对象

时间:2017-03-04 17:05:39

标签: c++ stl

我有一个包含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 );

0 个答案:

没有答案