我真的想用地图围绕'const'问题

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]限定符可以解决我的问题,但我真的希望清楚地了解究竟发生了什么.我猜测编译器对我访问地图感到不满(在我上面的第二次尝试中),并且相信我将使用和滥用我对地图内容的访问权限.我真的希望/需要能够向其他人解释这样的事情,并且尽量不要滥用语言并最终以"每日跆拳道"结束,因为,你知道,羞耻和蠢事.

Dav*_*own 5

如果你查看map的operator []的声明,你会发现它const不合格,这就是为什么它不能被调用const std::map<std::string, double>.它不是const的原因是因为如果地图中不存在该键,则会创建它.您应该使用findat获取元素.