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)
有没有人知道我们为什么看到这个?
因为m_mapFileNameToLogStrg在const成员函数中被视为const成员.这是因为该指针的类型是'LogManager const*'.那么迭代器怎么能iter不是const?
如果iter是非const,则可以用它来修改成员m_mapFileNameToLogStrg(被视为const),从而违反constness.
所以这里有几个选择:
a)使成员函数非const(写成员函数是const ??)
b)使字符串数据成员可变.
c)按照Luca Martini的建议使用const_iterator