一个奇怪的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::test1
的const
对象test2
调用非const
函数test2.test()
。
testing::test1
将test2
作为参数const testing &test2
。 所以在testing::test1
, test2const
。 然后在函数的第一行:
test2.test()
test2
testing::test
函数被调用。 这个函数在签名结束时没有用const
声明,所以它可以修改它被调用的对象( this
指针隐含地传递给它),即使它没有,编译器也会这样做。 通过让你在那里调用它,编译器将允许你修改一个const
variables,而不用明确的强制转换,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报告这个问题)。
- XCode 4.1致命错误:自编译预编译头之后,修改了stdlib
- 问题sorting使用成员函数作为比较
- C#错误:父不包含一个构造函数,它需要0个参数
- 意外的文件错误结束
- 不能将types'System.Collections.Generic.IEnumerable <AnonymousType#1>'隐式转换为'System.Collections.Generic.List <string>
- 将块内的variables分配给块外的variables
- “ClickOnce不支持请求执行级别requireAdministrator”。
- ImportError:没有模块命名请求
- generics方法上的多个通配符使Java编译器(和我!)非常困惑