g++编译报错:passing const vector作为this参数丢弃限定符
编译错误原因及解决办法
错误本质
你写的key_board_checker::step1() const是const成员函数,这类函数的规则是:函数内部访问的所有类成员变量都会被自动视为const对象。而std::vector::resize()是会修改容器大小、内部内存布局的非const成员函数,const对象不能调用这类修改自身的方法,所以编译器抛出“丢弃限定符”的错误——本质是你在不允许修改成员的函数里,尝试调用了修改成员的方法。
两种解决思路
思路一:去掉函数的const限定
如果step1()函数的逻辑本来就需要修改类的成员(比如调整final的大小),那这个函数就不应该被声明为const。直接删掉函数声明后的const关键字即可:// 修正后的函数声明 void key_board_checker::step1() { // 去掉末尾的const final.resize(numalnumidx); // 正常编译 }思路二:给成员变量加mutable修饰
如果step1()必须保持const(比如它是一个只读逻辑的函数,只是final是临时缓存类的变量),可以把final声明为mutable——这个关键字专门用来标记那些即使在const函数里也允许修改的成员:// 类内成员声明 class key_board_checker { private: mutable std::vector<std::vector<std::string>> final; // 加mutable // 其他成员... public: void step1() const; };注意:
mutable不能滥用,只适合那些不影响类对外可见逻辑状态的变量(比如缓存、统计计数),如果final是类的核心状态变量,用这个方法会破坏const函数的语义。
代码示例对比
错误写法(触发报错):
class key_board_checker { private: std::vector<std::vector<std::string>> final; public: void step1() const { final.resize(5); // 编译报错 } };
修正写法1(去掉const):
class key_board_checker { private: std::vector<std::vector<std::string>> final; public: void step1() { final.resize(5); // 正常编译 } };
修正写法2(用mutable):
class key_board_checker { private: mutable std::vector<std::vector<std::string>> final; public: void step1() const { final.resize(5); // 正常编译 } };
内容的提问来源于stack exchange,提问作者Vinod
相关产品推荐
相关产品推荐

