一个奇怪的C ++错误:test.cpp:15:错误:作为'*'的'this'parameter passing'const *'丢弃限定符

我有一些特定的代码的麻烦,如果任何人都可以在这个问题上给我启发,这将不胜感激,我已经隔离了下面的示例中的问题:

#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:error:作为'int testing :: test()'的'this'parameter passing'const testing'会丢弃限定符

非常感谢!

问题是从testing::test1const对象test2调用非const函数test2.test()

testing::test1test2作为参数const testing &test2 。 所以在testing::test1test2const 。 然后在函数的第一行:

 test2.test() 

test2 testing::test函数被调用。 这个函数在签名结束时没有用const声明,所以它可以修改它被调用的对象( this指针隐含地传递给它),即使它没有,编译器也会这样做。 通过让你在那里调用它,编译器将允许你修改一个constvariables,而不用明确的强制转换,C ++不应该允许。 因此要解释错误信息

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

this是指成员函数( testing::test )在其上运行的对象,在这种情况下,它不是const ,因为testing::test没有用const声明,因此在尝试创build一个非成员const时会检测到不匹配, const指针( this )引用const对象( testing ),忽略const 限定符

为了解决这个问题 ,决定testing::test函数是否需要修改它所调用的对象(现在写入的方式不是这样,因为它只是return 1 ,但是可能会改变,所以你需要思考它的预期function是什么)。 如果它应该,那么显然在一个const对象上调用它是不好的,虽然你可以使用const_cast来让编译器覆盖它,但这是危险的。 如果不是的话,那就把它标记为const ,这样它也可以在const对象上调用:

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

由于成员函数test1的定义:

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

你传入一个variablestest2的const引用。

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

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

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

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

该行:test2.test()

正在调用非const函数,即使test2是一个const引用。 那就是问题所在。 你可以通过testing::testing一个const函数来解决这个问题。

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

由于test()方法实际上并没有改变任何数据,因此最好的做法是将其设置为const,如下所示:

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

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

对于一个快速和肮脏的解决scheme,尝试使用编译器本身经常提示的-fpermissive编译(这可能是VisualStudio编译器所做的,因为Windows用户很less报告这个问题)。