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

先上错误:

../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;
}

 

<think>嗯,我现在遇到了一个C++编译错误,提示是“error: passingconst QPointF’ asthisargument discards qualifiers [-fpermissive]”。这让我有点困惑,我需要仔细分析一下这个问题。 首先,我应该回忆一下这个错误信息的意思。错误提到的是将const对象作为‘this’参数传递,导致限定符被丢弃。这可能是因为在一个const对象上调用了一个非const成员函数。因为在C++中,当对象被声明为const时,只能调用其const成员函数。如果尝试调用非const成员函数,编译器会报错,因为这会破坏对象的常量性。 现在,问题涉及的是Qt的QPointF类。QPointF代表的是一个二维坐标系中的点,通常使用浮点数作为坐标值。QPointF类有很多成员函数,比如x()、y()用来获取坐标,还有可能有一些修改坐标的函数,比如setX()、setY()。 假设我的代码中有类似这样的情况:我有一个const QPointF对象,然后调用了它的某个非const成员函数。例如: const QPointF point(10.5, 20.3); point.setX(5.0); // 这里会出错,因为setX是非const函数 或者,可能是在一个const成员函数内部,对QPointF对象调用了非const方法: class MyClass { public: void myMethod() const { QPointF point(1.0, 2.0); point.setX(3.0); // 这里没问题,因为point不是const对象 const QPointF anotherPoint(4.0, 5.0); anotherPoint.setY(6.0); // 这里会触发错误,因为anotherPoint是const的 } }; 这时候,在myMethod()这个const成员函数中,anotherPoint被声明为const QPointF,调用setY()就会导致问题,因为setY()是非const成员函数。 接下来,我需要检查自己的代码,找到哪里用了const QPointF对象,并且调用了它的非const成员函数。比如,可能在某个地方传递了一个const QPointF&参数,然后试图修改它的值: void myFunction(const QPointF& point) { point.rx() = 5.0; // rx()返回的是x坐标的引用,但这里point是const,所以rx()需要是const版本 } 这里的问题在于,rx()是一个非const成员函数,它返回x坐标的可修改引用。当point是const时,调用rx()就会导致上述错误,因为无法在const对象上调用非const函数。 解决方法是什么呢?如果我的意图是修改QPointF的坐标,那么我不能将其声明为const。或者,如果该对象本身应该是不可变的,那么我需要避免调用非const函数。例如,如果只是想读取坐标,应该使用x()和y()这两个const成员函数: void printPoint(const QPointF& point) { qDebug() << point.x() << point.y(); // 正确,x()和y()是const函数 } 但如果确实需要修改坐标,那么参数不能是const的,或者需要去掉const限定符,但后者需要确保这样做是安全的,不会破坏程序的逻辑。 另外,有时候可能是因为在某个返回QPointF的函数中,返回的是一个const对象,而尝试修改返回值: const QPointF getPoint() { return QPointF(1.0, 2.0); } // 其他地方调用 getPoint().setX(3.0); // 错误,因为返回的是const临时对象 这里,getPoint()返回的是const QPointF对象,临时对象是const的,因此调用setX()是非法的。解决方法可能是去掉返回类型的const,或者不修改返回的临时对象。 总结一下,这个错误的原因是在const对象上调用非const成员函数,解决方法包括: 1. 检查相关对象是否应该被声明为const,如果不是,去掉const限定符。 2. 如果对象确实需要是const,确保只调用其const成员函数。 3. 修改成员函数的const性,如果可能的话,将成员函数声明为const。 4. 检查是否错误地修改了临时对象或返回值。 例如,在QPointF的文档中,可以查看哪些方法是const的。比如,x()和y()是const函数,而rx()和ry()是非const的,因为它们返回的是可修改的引用。因此,当处理const QPointF对象时,应使用x()和y()来获取值,而不是rx()或ry()。 所以,在代码中如果出现类似以下情况: const QPointF p(1.0, 2.0); p.rx() = 3.0; // 错误,rx()是非const的 应该改为: QPointF p(1.0, 2.0); // 非const对象 p.rx() = 3.0; // 正确 或者,如果必须使用const对象,则需要通过其他方式获取值,但无法修改。 另外,有时候问题可能出现在函数参数上,比如: void adjustPoint(const QPointF& p) { p.rx() += 10.0; // 错误,p是const引用,无法调用rx() } 这时候应该检查函数的设计,是否需要修改p。如果不需要修改,那么不应该调用非const函数。如果需要修改,应该去掉参数中的const: void adjustPoint(QPointF& p) { p.rx() += 10.0; // 正确 } 或者,如果函数内部需要修改p的副本,可以创建副本: void adjustPoint(const QPointF& p) { QPointF copy = p; copy.rx() += 10.0; // 正确,操作的是副本 // 使用copy... } 总之,问题的核心在于const正确性,确保在const对象上只调用不会修改对象状态的成员函数。需要仔细检查代码中涉及QPointF对象的地方,确认其const性是否正确,并调整函数调用或对象声明以符合const规则。</think>这个错误是由于在C++中尝试在`const`对象上调用非`const`成员函数引起的。具体来说,当你有一个被声明为`const`的`QPointF`对象(或引用/指针),并调用了修改其成员的方法时,编译器会阻止这种操作,因为`const`对象的内容不应被修改。 ### 错误原因分析: 1. **对象被声明为`const`**:例如 `const QPointF point(1.0, 2.0);`。 2. **调用了非`const`成员函数**:如 `point.setX(3.0);` 或 `point.rx() = 5.0;`(`setX()`和`rx()`都是非`const`函数)。 3. **违反`const`正确性**:`const`对象只能调用被标记为`const`的成员函数,确保对象状态不被修改。 --- ### 示例代码及问题: ```cpp const QPointF p(10.0, 20.0); p.setY(30.0); // 错误!setY() 是非 const 成员函数 p.rx() = 5.0; // 错误!rx() 返回可修改的引用,但 p 是 const ``` --- ### 解决方法: #### 1. **移除不必要的`const`限定符**: 如果对象本身需要被修改,不要声明为`const`: ```cpp QPointF p(10.0, 20.0); // 非 const 对象 p.setY(30.0); // 正确 ``` #### 2. **使用`const`成员函数**: 仅调用`const`方法,如`x()`、`y()`: ```cpp const QPointF p(10.0, 20.0); double x = p.x(); // 正确,x() 是 const 函数 ``` #### 3. **函数参数传递问题**: 如果函数参数是`const`引用,但内部需要修改对象,需移除`const`: ```cpp void modifyPoint(QPointF& p) { // 非 const 引用 p.setX(100.0); } ``` #### 4. **临时对象的修改**: 不要尝试修改返回的临时`const`对象: ```cpp const QPointF getPoint() { return QPointF(1.0, 2.0); } getPoint().setX(5.0); // 错误!临时对象是 const 的 ``` --- ### QPointF 的 `const` 与 非`const` 函数: - **`const`函数(安全调用)**: ```cpp double x() const; // 返回 x 坐标,不修改对象 double y() const; ``` - **非`const`函数(可能修改对象)**: ```cpp qreal& rx(); // 返回 x 的可修改引用 qreal& ry(); void setX(qreal x); void setY(qreal y); ``` --- ### 总结: - **确保`const`对象仅调用`const`成员函数**。 - 检查对象声明、函数参数和返回值中的`const`限定符。 - 如果需修改对象,不要使用`const`声明。 - 参考Qt文档确认函数的`const`属性:[QPointF Class](https://doc.qt.io/qt-5/qpointf.html)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值