我在使用特定的代码时遇到了一些问题,如果有人能够就此问题启发我,我将非常感激,我已经在以下示例中将问题排除在外:
#includeusing 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'参数传递,丢弃限定符
非常感谢!
问题是从一个对象调用非const
函数.test2.test()
const
test2
testing::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 { // ... }
由于成员函数test1的定义:
int testing::test1(const testing& test2){ test2.test(); return 1; }
您正在传递变量test2的const引用.
这意味着您无法修改test2的任何成员,也无法调用任何非const或非静态的成员函数.
以下是您可以修复的方法:
int testing::test() const { return 1; }
最后的额外const告诉编译器您没有计划修改当前对象的内容(如果这样做,您将得到不同的编译错误).