错误:传递' const ...'作为'这个' ' ...'的论点丢弃限定符

时间:2014-11-16 23:54:28

标签: c++

  

错误:传递' const A'作为'这个' ' void A :: hi()'的论点丢弃   限定符[-fpermissive]

我不明白为什么我会收到此错误,我没有返回任何内容只是传递对象的引用,就是这样。

#include <iostream>

class A
{
public:
    void hi()
    {
        std::cout << "hi." << std::endl;
    }
};

class B
{
public:
    void receive(const A& a) {
        a.hi();
    }
};

class C
{
public:
    void receive(const A& a) {
        B b;
        b.receive(a);
    }
};

int main(int argc, char ** argv)
{
    A a;
    C c;
    c.receive(a);

    return 0;
}

@edit

我使用const正确性修复它但现在我试图在同一个方法中调用方法并得到相同的错误,但奇怪的是我没有传递对此方法的引用

#include <iostream>

class A
{
public:
    void sayhi() const
    {
        hello();
        world();
    }

    void hello()
    {
        std::cout << "world" << std::endl;
    }

    void world()
    {
        std::cout << "world" << std::endl;
    }
};

class B
{
public:
    void receive(const A& a) {
        a.sayhi();
    }
};

class C
{
public:
    void receive(const A& a) {
        B b;
        b.receive(a);
    }
};

int main(int argc, char ** argv)
{
    A a;
    C c;
    c.receive(a);

    return 0;
}
  

错误:传递&#39; const A&#39;作为&#39;这个&#39;参数&#39; void A :: hello()&#39;   抛弃限定符[-fpermissive]

     

错误:传递&#39; const A&#39;作为&#39;这个&#39; &#39; void A :: world()&#39;   抛弃限定符[-fpermissive]

2 个答案:

答案 0 :(得分:20)

您的hi方法未在A类中声明为const。因此,编译器无法保证调用a.hi()不会更改对a的常量引用,因此会引发错误。

您可以阅读有关常量成员函数here的更多信息,并正确使用const关键字here

答案 1 :(得分:0)

  1. 如前所述,一种选择是使 hi 方法具有常量限定性。

  2. 另一种选择是在调用 hi 方法时使用 const_cast 像这样

<块引用>
A& ref = const_cast <A&>(a);
ref.hi();