error: passing ‘const xxx’ as ‘this’ argument discards qualifiers [-fpermissive]的解决方案

本文解析了在Rectangle类的赋值运算符中遇到的编译错误,指出由于返回值未加const限定,导致尝试修改const对象时出现问题。通过修改getLowerLeft和getUpperRight函数为const,解决了这一问题并提供了代码修复建议。

先上错误:

../include/rectangle.h: In instantiation of 'R_START_TREE::Rectangle<dimensions>& R_START_TREE::Rectangle<dimensions>::operator=(const R_START_TREE::Rectangle<dimensions>&) [with long long unsigned int dimensions = 3]':

rectangle_test.cpp:50:41:   required from here

../include/rectangle.h:79:33: error: passing 'const R_START_TREE::Rectangle<3>' as 'this' argument discards qualifiers [-fpermissive]

                 this->lowerLeft = rectangle.getLowerLeft();

错误解释:

直译:错误:将“const xxx”作为“this”参数传递会丢弃限定词。

  • discards qualifiers:丢弃限定符,当尝试修改const类型时,会报discards qualifiers
  • -fpermissive:将有关不合格代码的某些诊断从错误降级为警告。因此,使用-fpermissive将允许编译一些不合格的代码。

放到我们的代码里,就是下面的两个this的赋值。下面的代码是要重载=运算符,就是将rectangle的左下角和右上角(Point类对象)赋给this的左下角和右上角这两个私有变量。

 Rectangle & operator=(const Rectangle &rectangle)
 {
     if(this != &rectangle)
     {
           this->lowerLeft = rectangle.getLowerLeft();
           this->setUpperRight(rectangle.getUpperRight());
     }
     return *this;
  }

Point<dimensions> getLowerLeft()
{
     return lowerLeft;
}

Point<dimensions> getUpperRight()
{
     return upperRight;
}

根据上述原因,我们可以确定,是因为Rectangle类的getUpperRight()和getLowerLeft()函数返回值都不是const限定的,所以,我们只需要修改这俩函数的声明即可。后面在对类中的getXXX()返回类的对象的时候,还是要尽量用const限定。

Point<dimensions> getLowerLeft() const
{
     return lowerLeft;
}

Point<dimensions> getUpperRight() const
{
     return upperRight;
}

 

### 错误原因 `passing const xxx as 'this' argument discards qualifiers` 错误通常在尝试通过 `const` 对象调用非 `const` 成员函数时出现。在 C++ 里,`const` 对象只能调用 `const` 成员函数,因为 `const` 成员函数承诺不会修改对象的状态。若使用 `const` 对象调用非 `const` 成员函数,编译器会认为这可能会修改对象的状态,从而产生该错误。这是因为非 `const` 成员函数隐含的 `this` 指针是指向非常量对象的指针,而 `const` 对象传递给它时,会丢弃 `const` 限定符,违背了 `const` 对象不可修改的原则[^1][^2][^3][^4]。 例如以下代码会触发该错误: ```cpp #include <iostream> class MyClass { public: int value; // 非 const 成员函数 void modifyValue() { value = 10; } }; int main() { const MyClass obj; obj.modifyValue(); // 错误:passing 'const MyClass' as 'this' argument discards qualifiers return 0; } ``` ### 解决办法 - **将成员函数声明为 `const`**:若成员函数不会修改对象的状态,可将其声明为 `const` 成员函数。这样 `const` 对象就能调用该函数。 ```cpp #include <iostream> class MyClass { public: int value; // const 成员函数 void printValue() const { std::cout << value << std::endl; } }; int main() { const MyClass obj; obj.printValue(); // 正确 return 0; } ``` - **避免使用 `const` 对象调用非 `const` 成员函数**:若确实需要修改对象的状态,可使用非常量对象调用非 `const` 成员函数。 ```cpp #include <iostream> class MyClass { public: int value; // 非 const 成员函数 void modifyValue() { value = 10; } }; int main() { MyClass obj; obj.modifyValue(); // 正确 return 0; } ``` - **使用 `mutable` 关键字**:若成员函数需要修改对象的某些状态,但该成员函数又被声明为 `const`,可使用 `mutable` 关键字修饰这些成员变量,使其能在 `const` 成员函数中被修改。 ```cpp #include <iostream> class MyClass { public: mutable int counter; // const 成员函数 void incrementCounter() const { counter++; } }; int main() { const MyClass obj; obj.incrementCounter(); // 正确 std::cout << obj.counter << std::endl; return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值