C++ 编译报错discards qualifiers [-fpermissive]

本文探讨了C++中map类的at与[]成员函数的区别,并通过实例展示了如何正确使用at函数来避免编译错误。文章还强调了在处理const对象时选择合适成员函数的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


声明了一个类

class Card

{

public:   

   Card(const string&);

   int m_value;    

   char m_suit;    

private:    

    const static map<char, int> m_map;

};

const map<char, int> Card::m_map=    

{        

        {'2', 2},

        {'3', 3},

        {'4', 4},

        {'5', 5},

        {'6', 6},

        {'7', 7},

        {'8', 8},

        {'9', 9},

        {'T', 10},

        {'J', 11},

        {'Q', 12},

        {'K', 13},  

       {'A', 14}  

   };

Card::Card( const string& p_cardVal)

{    

    //m_value = Card::m_map[(p_cardVal[0]];

    m_value = Card::m_map.at(p_cardVal[0]);

    m_suit = p_cardVal[1];

}

红线部分会报错,显示error: passing ‘const std::map<char, int>’ as ‘this’ argument discards qualifiers [-fpermissive]

查看CPP reference 可以知道,map的[],都是非const 的,而m_map是const的对象,于是会报错。(见http://blog.youkuaiyun.com/xidwong/article/details/52754514)

T& operator[]( const Key& key );(1)
T& operator[]( Key&& key ); (2)

在map的成员函数中,at成员函数

T& at( const Key& key );(1)
const T& at( const Key& key ) const;(2)
因此使用下面的at便可以解决这个编译错误。


这个fpermissive 编译选项 千万不可以强制加上, 否则即使编译通过,运行结果可能和预期的有很大的区别。甚至会引起crash!!!!!!





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值