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