当前位置:  开发笔记 > 编程语言 > 正文

奇怪的C++错误:test.cpp:15:错误:将'const*'作为'*'的'this'参数传递丢弃限定符

如何解决《奇怪的C++错误:test.cpp:15:错误:将'const*'作为'*'的'this'参数传递丢弃限定符》经验,为你挑选了2个好方法。

我在使用特定的代码时遇到了一些问题,如果有人能够就此问题启发我,我将非常感激,我已经在以下示例中将问题排除在外:

#include 

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'参数传递,丢弃限定符

非常感谢!



1> Tom Alsberg..:

问题是从一个对象调用非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 {
    // ...
}



2> Brian R. Bon..:

由于成员函数test1的定义:

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

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

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

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

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

最后的额外const告诉编译器您没有计划修改当前对象的内容(如果这样做,您将得到不同的编译错误).

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有