关于C++中的iterator和const问题

Ven*_*ta 1 c++

class LogManager {
  private:
    mutable mapManagerMutex mapMutex;

    typedef std::map<std::string, LogStorage*> FileNameToStorageClass;
    FileNameToStorageClass  m_mapFileNameToLogStrg;

  public:
    int write( const string& strFileName, char* text ) const;

};

int LogManager::write( const string &strFileName, char* text ) const
{
   mapManagerMutex::scoped_lock lock(mapMutex);
   FileNameToStorageClass::iterator iter;
   iter = m_mapFileNameToLogStrg.find(strFileName);
   if(iter != m_mapFileNameToLogStrg.end())
   {
     // do some thing.
   }
   else
   {
     return -1;
   }
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我在写函数结束时没有const,则上面的代码编译.如果我在结束时添加const我会得到以下错误

D:/LogManager.cpp:133: error: no match for 'operator=' in 'iter = ((const RtsInfrastructure::RtsCommon::Diagnostics::LogManager*)this)-
cc: C:/QNX650/host/win32/x86/usr/lib/gcc/i486-pc-nto-qnx6.5.0/4.4.2/cc1plus caught signal 1
Run Code Online (Sandbox Code Playgroud)

有没有人知道我们为什么看到这个?

Chu*_*dad 7

因为m_mapFileNameToLogStrg在const成员函数中被视为const成员.这是因为该指针的类型是'LogManager const*'.那么迭代器怎么能iter不是const?

如果iter是非const,则可以用它来修改成员m_mapFileNameToLogStrg(被视为const),从而违反constness.

所以这里有几个选择:

a)使成员函数非const(写成员函数是const ??)

b)使字符串数据成员可变.

c)按照Luca Martini的建议使用const_iterator


Luc*_*ini 6

FileNameToStorageClass::const_iterator而不是FileNameToStorageClass::iterator.