43

我在使用一段特定的代码时遇到了一些问题,如果有人能在这件事上给我启发,我将不胜感激,我已在以下示例中隔离了问题:

#include <iostream>

using namespace std;

class testing{
   int test();
   int test1(const testing& test2);
};

int testing::test(){
   return 1;
}

int testing::test1(const testing& test2){
   test2.test();
   return 1;
}

那么可能导致以下错误的原因是:

test.cpp:15:错误:将 'const testing' 作为 'int testing::test()' 的 'this' 参数传递会丢弃限定符

非常感谢!

4

5 回答 5

69

问题是从. const_ _test2.test()consttest2testing::test1

testing::test1获取test2作为参数const testing &test2。所以在testing::test1, test2const. 然后在函数的第一行:

test2.test()

testing::test函数在 上调用test2。该函数没有const在签名结束时声明,因此它可能会修改调用它的对象(this隐式传递给它的指针),即使它没有,编译器也会假设。通过让您在那里调用它,编译器将允许您在const没有显式转换的情况下修改变量,这是 C++ 不应该允许的。 因此解释错误信息

test.cpp:15: error: passing ‘const testing’ as ‘this’ argument of ‘int testing::test()’ discards qualifiers

this引用成员函数 ( testing::test) 操作的对象,在这种情况下它不是const,因为testing::test没有用 声明const,因此在尝试使非const指针 ( this) 引用const对象 ( testing) 时检测到不匹配,忽略const 限定符。_

为了解决这个问题,决定testing::test函数是否需要修改它被调用的对象(它现在的编写方式不需要,因为它所做的只是return 1,但是可能会改变,所以你需要考虑它的意图功能是)。如果应该,那么显然在const对象上调用它是不好的,尽管您可以使用const_cast要求编译器覆盖它,但这很危险。如果不应该,则标记它const,以便它也可以在const对象上调用:

class testing{
    int test1() const;
    // ...
}

int testing::test() const {
    // ...
}
于 2009-02-15T06:45:27.047 回答
5

由于成员函数test1的定义:

int testing::test1(const testing& test2){
   test2.test();
   return 1;
}

您正在传递变量 test2 的 const 引用。

这意味着您不能修改 test2 的任何成员,也不能调用任何非 const 或非静态的成员函数。

以下是您可以修复的方法:

int testing::test() const {
   return 1;
}

最后额外的 const 告诉编译器你不打算修改当前对象的内容(如果你这样做了,你会得到一个不同的编译错误)。

于 2009-02-15T07:02:28.267 回答
2

行:test2.test()

正在调用非 const 函数,即使 test2 是 const 引用。那就是问题所在。您可以通过将 testing::test 设为 const 函数来解决此问题。

于 2009-02-15T06:46:24.437 回答
1

testing::test1(const testing& test2) 期望传递的对象是 const,如果你修改它的变量的值,或者访问没有明确定义为 const 的任何方法,它会给你一个错误。

由于 test() 方法实际上不会更改任何数据,因此最佳做法是将其设置为 const,如下所示:

class testing{
   int test() const;
   int test1(const testing& test2);
};

int testing::test() const {
   return 1;
}

或者,在为 test1() 定义参数时,只需删除 const 一词,它将允许您在闲暇时访问任何传递的对象的方法。

于 2009-02-15T07:11:54.987 回答
-1

For a quick and dirt solution, try compiling with -fpermissive as often suggested by the compiler itself (which is probably what VisualStudio compilers do, being that Windows users seldom report this problem).

于 2015-05-26T14:18:58.513 回答