Fur*_*lon 43 c++ compiler-errors 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;
}
Run Code Online (Sandbox Code Playgroud)
那么可能导致以下错误:
test.cpp:15:错误:将'const testing'作为'int testing :: test()'的'this'参数传递,丢弃限定符
非常感谢!
Tom*_*erg 68
问题是从一个对象调用非const函数.test2.test()consttest2testing::test1
testing::test1得到test2一个参数const testing &test2.在内testing::test1,test2const.然后在函数的第一行:
test2.test()
Run Code Online (Sandbox Code Playgroud)
testing::test调用该函数test2.该函数未const在签名端声明,因此它可能会修改它所调用的对象(this指针隐式传递给它),即使它没有,编译器也会这样做.通过让你在那里调用它,编译器可以让你修改一个const没有显式强制转换的变量,C++不允许这样做. 因此要解释错误消息:
test.cpp:15: error: passing ‘const testing’ as ‘this’ argument of ‘int testing::test()’ discards qualifiers
Run Code Online (Sandbox Code Playgroud)
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 {
// ...
}
Run Code Online (Sandbox Code Playgroud)
由于成员函数test1的定义:
int testing::test1(const testing& test2){
test2.test();
return 1;
}
Run Code Online (Sandbox Code Playgroud)
您正在传递变量test2的const引用.
这意味着您无法修改test2的任何成员,也无法调用任何非const或非静态的成员函数.
以下是您可以修复的方法:
int testing::test() const {
return 1;
}
Run Code Online (Sandbox Code Playgroud)
最后的额外const告诉编译器您没有计划修改当前对象的内容(如果这样做,您将得到不同的编译错误).