passing '' as 'this' argument discards qualifiers [-fpermissive]

本文探讨了C++中const限定符的使用位置对编译的影响,特别是当从父类继承的纯虚函数调用类内函数时,如何避免passing '' as 'this' argument discards qualifiers [-fpermissive]的编译错误。提供了两种解决方案:一是通过添加const修饰符确保函数不修改状态;二是将相关函数移出类外。

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

本文主要参考了 const放置的位置   https://blog.youkuaiyun.com/caojunhao123/article/details/43699873

C++编译程序出现了这个错误“passing '' as 'this' argument discards qualifiers [-fpermissive]”

其实主要原因还是在const这个限定符上 ,代码中从父类继承来的纯虚函数实现时调用了类中的函数,按理说逻辑应该可以编译过去,但是c++编译器总是假定你可以将值修改,所以提示错误(这里还是有点小疑问,并没有更改randomUnitNormal函数值啊?为什么会报错?)

方法有二:

第一种:randomUnitNormal()const ,可能这样就不会修改randomUnitNormal()的返回值p了吧,从而过了编译

第二种:因为我是写在头文件中,所以randomUnitNormal()可以作为独立的一个函数 ,不放入类中。但是要声明在调用之前。

贴上一张运行后的结果

 

<think>首先,用户的问题是关于C++错误:"error: passing 'const Book' as 'this' argument discards qualifiers"。用户提供了几个引用,这些引用描述了类似的错误情况。 关键错误信息是:"error: passing 'const Book' as 'this' argument discards qualifiers"。这通常发生在尝试通过一个常量对象调用一个非常量成员函数时。在C++中,当你有一个const对象时,你只能调用被声明为const的成员函数。 引用[3]解释了:"直译:错误:将“const xxx”作为“this”参数传递会丢弃限定词。discards qualifiers:丢弃限定符,当尝试修改const类型时,会报discards qualifiers"。引用[4]说:"这里要将this指定为const,不然的话当传递的是常量参数得话,常量参数无法调用非常量的成员函数"。 所以,解决方案是:确保当你有一个const对象时,你调用的成员函数也被声明为const。 现在,用户的具体错误是:"error: passing 'const Book' as 'this' argument discards qualifiers"。这暗示在代码中,有一个Book对象被声明为const,然后尝试调用一个非常量成员函数。 为了帮助用户解决这个问题,我需要提供一个结构化的回答。回答应该: 1. 解释错误的原因。 2. 提供解决方案。 3. 给出示例代码。 4. 生成相关问题,以帮助用户深入理解。 回答结构: - 先解释错误。 - 然后给出解决方案。 - 最后生成相关问题。 确保使用中文回答,因为用户要求中文。 生成相关问题:在回答结束时,添加几个相关问题,以引导用户学习更多。 现在,构建回答: 1. **解释错误**:这个错误发生在你尝试通过一个const对象调用一个非const成员函数时。在C++中,const对象只能调用const成员函数,因为它们保证不修改对象的状态。如果你调用一个非const函数,编译器会报错,因为它违反了const的承诺。 2. **解决方案**:将成员函数声明为const。这意味着在函数声明和定义中添加const关键字。例如,如果你的Book类有一个成员函数如print(),你应该声明它为void print() const; 而不是void print();。 3. **示例代码**:提供一个简单的Book类示例来演示错误和修复。 - 错误代码: ```cpp class Book { public: void print() { /* 打印书籍信息 */ } }; void someFunction(const Book& b) { b.print(); // 错误:b是const,但print()不是const成员函数 } ``` - 修复代码: ```cpp class Book { public: void print() const { /* 打印书籍信息 */ } // 添加const }; void someFunction(const Book& b) { b.print(); // 正确:print()是const成员函数 } ``` 4. **生成相关问题**:在结束时添加几个相关问题,如: - 如何声明一个const成员函数? - 为什么const对象只能调用const成员函数? - 在C++中,const成员函数和非常量成员函数有什么区别? 最后,确保回答清晰、逐步解决问题。</think>### C++ 错误 "error: passing 'const Book' as 'this' argument discards qualifiers" 的解决方法 在 C++ 中,错误信息 `error: passing 'const Book' as 'this' argument discards qualifiers` 通常发生在你尝试通过一个 `const` 对象调用一个非常量成员函数时。这个错误表示编译器检测到对 `const` 对象的非法操作:`const` 对象只能调用被声明为 `const` 的成员函数,因为它们保证不修改对象状态。如果调用非 `const` 成员函数,编译器会报错,因为这违反了 `const` 的语义(即对象不可修改)[^3][^4]。 #### 错误原因详解 - **核心问题**:`const` 对象的 `this` 指针类型是 `const ClassName*`,而非 `const` 成员函数的 `this` 指针是 `ClassName*`。当你通过 `const` 对象调用非 `const` 成员函数时,编译器无法安全地将 `const` 指针转换为非 `const` 指针(这会“丢弃限定符”,即丢弃 `const` 属性)。 - **常见场景**:在以下情况可能出现此错误: - 函数参数为 `const Book&` 或 `const Book*` 时,尝试调用 `Book` 类的非 `const` 成员函数。 - 对象本身被声明为 `const Book myBook;`,然后调用 `myBook.nonConstFunction()`。 - **示例错误代码**: ```cpp class Book { public: void printTitle() { // 错误:未声明为 const 成员函数 std::cout << title; } private: std::string title; }; void displayBook(const Book& b) { b.printTitle(); // 错误!b 是 const 引用,但 printTitle() 非 const } ``` 编译器会报错:`error: passing 'const Book' as 'this' argument discards qualifiers`,因为 `displayBook` 中的 `b` 是 `const`,但 `printTitle()` 不是 `const` 成员函数[^1][^3]。 #### 解决方法 要解决此错误,需确保所有通过 `const` 对象调用的成员函数都被声明为 `const`。以下是具体步骤: 1. **声明成员函数为 `const`**: - 在成员函数的声明和定义中添加 `const` 关键字,位置在函数参数列表后。这表示该函数不会修改对象状态。 - 语法:`返回类型 函数名(参数列表) const;` 2. **修改示例代码**: 修复上述错误代码: ```cpp class Book { public: void printTitle() const { // 添加 const 限定符 std::cout << title; // 此函数现在不会修改成员变量 } private: std::string title; }; void displayBook(const Book& b) { b.printTitle(); // 正确:printTitle() 是 const 成员函数 } ``` - 为什么有效:`printTitle()` 被声明为 `const`,因此 `const Book& b` 可以安全调用它,编译器不再报错[^4]。 3. **额外注意事项**: - **成员变量修改**:在 `const` 成员函数内,不能修改非 `static` 成员变量(除非变量被声明为 `mutable`)。 - **重载规则**:如果一个类有 `const` 和非 `const` 版本的重载函数,编译器会根据对象类型自动选择正确版本。 - **编译器选项**:虽然可以使用 `-fpermissive` 选项降级错误为警告(如引用[3]所述),但不推荐,因为它会掩盖潜在逻辑错误。优先修复代码本身[^3]。 #### 预防措施 - 在设计类时,如果成员函数不修改对象状态,一律声明为 `const`。 - 使用 `const` 引用作为函数参数时,确保调用的所有成员函数都是 `const`。 - 在团队协作中,添加代码审查环节检查 `const` 正确性。 通过以上步骤,你可以彻底解决 `discards qualifiers` 错误,并提升代码的健壮性。如果问题持续,检查相关函数是否遗漏 `const` 声明,或是否在 `const` 上下文中意外调用了非 `const` 函数[^1][^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值