hEA*_*ASH 2 c++ dictionary const operator-overloading
可能重复:
为什么STL映射的[]运算符不是?
我把它归结为(我认为)最简单的形式:
#include <iostream>
#include <map>
#include <vector>
class NumberHolder
{
public:
NumberHolder( const std::string aKey, const double aNumber );
void printSmallestMappedNumber( const unsigned int theIndex ) const;
private:
std::vector< std::map< std::string, double> > theNamedNumberMapVector;
};
NumberHolder::NumberHolder( const std::string key, const double aNumber )
{
std::map<std::string, double> aTempMap;
aTempMap[key] = aNumber;
theNamedNumberMapVector.push_back(aTempMap);
}
void NumberHolder::printSmallestMappedNumber( const unsigned int theIndex ) const
{
std::map<std::string, double>& aSpecificMap = theNamedNumberMapVector[theIndex];
std::cout << aSpecificMap["min"] << std::endl;
}
int main(int argc, char* argv[])
{
NumberHolder aTaggedNumberHolder("min", 13);
aTaggedNumberHolder.printSmallestMappedNumber( 0 );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我有一个充满地图的矢量,每个地图都有(字符串)"标记"数字.我试图控制对所涉及变量的可见性/可变性的访问.
无论如何,编译器失败并出现此错误
将类型为'std :: map'的引用绑定到类型为'const std :: map,double,std :: less>,std :: allocator,double >>>'的值将删除限定符
我的第一个(未充分的)尝试是使地图const ...,因为我没有修改地图,只从中检索一个值:
const std::map<std::string, double>& aSpecificMap = theNamedNumberMapVector[theIndex];
Run Code Online (Sandbox Code Playgroud)
然后,这让我觉得这个更短,但实际上有点混淆错误:
No viable overloaded operator[] for type 'const std::map<std::string, double>'
Run Code Online (Sandbox Code Playgroud)
而是在以下行:
std::cout << aSpecificMap["min"] << std::endl;
Run Code Online (Sandbox Code Playgroud)
然而,也许是因为我一直试图解开这个问题,我的解决方案看起来非常糟糕,非常苛刻:
std::map<std::string, double>& aSpecificMap = const_cast<std::map<std::string, double>&>(theNamedNumberMapVector[theIndex]);
Run Code Online (Sandbox Code Playgroud)
const_casting离开[const derp]限定符可以解决我的问题,但我真的希望清楚地了解究竟发生了什么.我猜测编译器对我访问地图感到不满(在我上面的第二次尝试中),并且相信我将使用和滥用我对地图内容的访问权限.我真的希望/需要能够向其他人解释这样的事情,并且尽量不要滥用语言并最终以"每日跆拳道"结束,因为,你知道,羞耻和蠢事.
如果你查看map的operator []的声明,你会发现它const不合格,这就是为什么它不能被调用const std::map<std::string, double>.它不是const的原因是因为如果地图中不存在该键,则会创建它.您应该使用find或at获取元素.