C++ 关于C++;

C++ 关于C++;,c++,C++,有谁知道我们为什么会看到这一点吗?使用FileNameToStorageClass::const\iterator而不是FileNameToStorageClass::iterator使用FileNameToStorageClass::const\iterator而不是FileNameToStorageClass::iterator,因为m\u-map-FileNameToStorageClass::const>被视为常量成员函数中的常量成员。这是因为此指针的类型为“LogManager con

有谁知道我们为什么会看到这一点吗?

使用
FileNameToStorageClass::const\iterator
而不是
FileNameToStorageClass::iterator
使用
FileNameToStorageClass::const\iterator
而不是
FileNameToStorageClass::iterator

,因为
m\u-map-FileNameToStorageClass::const>被视为常量成员函数中的常量成员。这是因为此指针的类型为“LogManager const*”。那么迭代器
iter
怎么可能是非常量的呢

如果
iter
为非常量,则可使用它修改成员
m_mapfilename tologstrg
(被视为常量),从而违反常量

因此,这里有几个选项:

a) 使成员函数为非常量(写入成员函数为常量??)

b) 使字符串成为数据成员 易变的

c) 使用常量迭代器作为 卢卡·马蒂尼建议


因为
m_mapFileNameToLogStrg
被视为const member函数中的const成员。这是因为此指针的类型为“LogManager const*”。那么迭代器
iter
怎么可能是非常量的呢

如果
iter
为非常量,则可使用它修改成员
m_mapfilename tologstrg
(被视为常量),从而违反常量

因此,这里有几个选项:

a) 使成员函数为非常量(写入成员函数为常量??)

b) 使字符串成为数据成员 易变的

c) 使用常量迭代器作为 卢卡·马蒂尼建议

如果在写函数末尾没有常量,代码将编译

这表明您正在对成员执行一些非常量操作,例如调用非常量函数。如果您要对的唯一成员是
m\u mapFileNameToLogStrg
,请检查其
find()
end()
是否为
const
。然后,正如Luca所说,find()的const版本应该返回一个const迭代器。如果您(或您的公司)自己实现了这些容器类型,很可能它们甚至没有合适的常量迭代器,因此您应该添加它们

如果在写函数末尾没有常量,代码将编译


这表明您正在对成员执行一些非常量操作,例如调用非常量函数。如果您要对的唯一成员是
m\u mapFileNameToLogStrg
,请检查其
find()
end()
是否为
const
。然后,正如Luca所说,find()的const版本应该返回一个const迭代器。如果您(或您的公司)自己实现了这些容器类型,很可能它们甚至没有合适的常量迭代器,因此您应该添加它们。

对于样式,您应该将
iter
的声明和初始化放在一条语句中。还有,为什么要用
string
作为文件名,而用
char*
作为文本名?@Space\u C0wb0y:这是对风格的一个敏锐观察,你应该把
iter
的声明和初始化放在一个语句中。另外,为什么要使用
string
作为文件名,但是文本的
char*
。@Space\u C0wb0y:这是一个尖锐的观察结果。这并不能解释OP关于抛出错误原因的查询。@Chubsbad查看您自己的答案了解详细动机这并不能解释OP关于抛出错误原因的查询。@Chubsbad查看您自己的答案了解详细动机
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;
}
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