Error:间接寻址级别不同——C++真的魔鬼
今天写程序报错了,上网去查这个错误:
错误 C2040 “remove”:“stu *(stu *)”与“stu *(stu *)”的间接寻址级别不同
查到了一个很让人震惊的点。
这是原楼主的问题
//用强制类型转换可以解决,但我想知道这是为什么错,第一次见到这错误#include <iostream>
using namespace std;class test
{public:
test(int* pi)
{this->pi=pi;
}
private:
int* pi;};int main()
{int *p = new int (8);
test(p);
}
/*
错误输出:
c:\documents and settings\wengtn\my documents\visual studio 2005\projects\werwer\werwer\weeeeer.cpp(60) : error C2040: “p”: “test”与“int *”的间接寻址级别不同
c:\documents and settings\wengtn\my documents\visual studio 2005\projects\werwer\werwer\weeeeer.cpp(60) : error C2512: “test”: 没有合适的默认构造函数可用
*/
一位老哥的回答:
test.cpp: In function `int main()’:
test.cpp:19: error: conflicting declaration ‘test p’
test.cpp:18: error: ‘p’ has a previous declaration as `intp’
test.cpp:19: error: declaration of `test p’
test.cpp:18: error: conflicts with previous declaration `int*p’
test.cpp:19: error: no matching function for call to `test::test()’
test.cpp:5: note: candidates are: test::test(const test&)
test.cpp:8: note: test::test(int)
上面代码用g++编译报上面的错误,g++编译器认为test( p );等价于 test p;当着变量定义了,和前面的定义冲突了。**
看到这我疑惑了,刚刚学习了与类相关的知识,我也想不通为啥,但这不重要,
然后问问题的老哥回复:
说对了
test(x)和test x是等价的,都是申明变量。
原来()可以用在申明中把变量名包起来,通常申明函数指针的时候会用到,原来用于一般变量也可以这样。
(int*) p 会被编译器认为是一个数据,变量名是绝不可能是这个样子的,所以就用这个数据作为参数构造test对象了,所以强制转换之后不会出错。
C++太神奇了,呵呵!
接下来还有一些分析,就不一一展示,总的来说,也就是test(p)语句这里出现了问题,编译器用这条语句生成了一个test的实例,而非提问者所预想的调用构造函数把p传进形参。因为程序肯定是被截取下来了一部分,所以不完整,我认为提问的人是想要调用定义的构造函数创建一个test的实例。
该语句为什么是生成p对象这一点,我觉得很新奇,因为我看书的时候没见过这么创建对象的,不知道原来还有这么一个处理策略(就知道有类型转换,结果还和问题无关)。但是基于这条处理策略,我们就要想办法抹除该二义性,test((int*)p)是合适的,因为(int*)不可能通过标识符规则那一关,那么编译器就会放弃以此为变量名创建test实例的策略,而进行提问者想要的行为——调用定义的构造函数构建一个无名test实例,以*p的值进行初始化。
因为听说C++细节特别多,见坑不记录下来怕日后被这种问题搅和得睡不着,就记这么多!
值得一提的是,我的问题并没有被解决,我还要去找。
Error:间接寻址级别不同——C++真的魔鬼相关推荐
- 间接寻址级别不同_详解西门子间接寻址之地址寄存器间接寻址
关于间接寻址分为存储器间接寻址和地址寄存器间接寻址,本文主要针对地址寄存器间接寻址进行详细讲解,关于存储器间接寻址可参见前面文章,链接如下: #详解西门子间接寻址之存储器间接寻址 [地址寄存器间接寻址 ...
- 间接寻址级别不同_被遗忘的利息税,国债与存款的利率区别,同大额存单的4点大不同...
2020年6月10日的储蓄式电子国债发行又一次与理财人擦肩而过,因为疫情管控原因,此次暂时不发行,那么下一个认购国债的窗口,就是7月10日,仍然是储蓄式电子国债,期限还是3年期和5年期两种.那么能如期 ...
- 间接寻址级别不同_单片机指令系统与寻址方式
单片机要正常运作,事先需编制程序,再把程序放入存贮器中,然后由CPU执行该程序.程序是由指令组成的,指令的基本组成是操作码和操作数.单片机的品种很多,设计时怎样表示操作码和操作数,都有各自的规定,再有 ...
- 间接寻址级别不同_「计算机组成原理」:常见的指令寻址方式
常见寻址方式操作数的寻址方式,就是CPU根据指令的操作数如何寻找真实的数据,或者真实的数据如何在指令 表示. 寻址方式是指寻找指令或者操作数的有效地址的方式.即确定本条指令的数据地址及下一条指令将要执 ...
- 间接寻址级别不同_金属激光切割机的不同配置是什么
激光切割是激光加工的一种方法,由于金属具有优异的吸收性能,在金属切削加工中具有良好的加工优势,不仅可以执行各种复杂图形的精细切割,而且超快的处理速度大大缩短了处理周期. 金属激光切割机有很多种. 固态 ...
- Go 学习笔记(54)— Go 第三方库之 uber-go/zap/lumberjack(记录日志到文件、支持自动分割日志、支持日志级别、打印调用文件、函数和行号)
1. 简要说明 zap 是 uber 开源的 Go 高性能日志库,支持不同的日志级别, 能够打印基本信息等,但不支持日志的分割,这里我们可以使用 lumberjack 也是 zap 官方推荐用于日志分 ...
- syslog打印不带等级_socket发送syslog不能获得级别
socket发送syslog不能获得级别 2019-10-12 497 0 使用logger可以设置debug, info, warning,error等级别,但直接通过socket方式发送日志无法获 ...
- java自定义日志级别_自定义log4j日志级别
因为项目中需要输出一些特别的日志来做数据统计.如果开启log4j提供的INFO日志级别,每天生成的日志文件就会变得越来越大.这样就得写个定 时任务来删除这个文件.为了只输出所需的日志级别,唯有自己定义 ...
- Log4j分级别记录日志文件
在记录日志的时候通常我们都希望不同级别的日志能够分别记录在不同的日志文件中,然后有一个汇总的日志文件记录所有的日志信息,因为在大多数情况下我们可能只会关注那些Error级别的日志信息.利用log4j去 ...
最新文章
- iphone如何信任软件_你还在用大众点评吗?评价软件失去信任还如何活下去
- 检测、量化、追踪新冠病毒,基于深度学习的自动CT图像分析有多靠谱?
- POJ3982 序列
- 安卓上比较好的python开发软件-手机随时随地写Python,还可以开发安卓APP,太厉害了!...
- qt on android 桌面鼠标事件,關於Qt on Android,程序安裝到手機,界面只占到一小部分。...
- 4.1.9 OS之文件系统的层次结构
- Yii Framework2.0开发教程(5)数据库mysql性能
- SAP Data Intelligence Graph使用浏览器访问的url规范
- 一个div压在另一个div上面_【CSS小分享】用CSS画一个新拟态风格键盘
- GCC中SIMD指令的应用方法
- 【水】uva10037 过桥
- 新用户时代最大的机会就是分享经济
- Silverlight 项目结构解析
- Flash中的计时器
- 计算机毕业设计源码—Springboot驾校考试网站系统
- PR-CTS-Specify Clock Tree Synthesis Options
- 通达OA2017 工作流设计中“退回”功能的升级测试(图文)
- 既然选择了编程,只管风雨兼程
- 电驴服务器更新的作用,[转载]【强烈推荐更新】最新电驴服务器列表(2013.7.11)...
- 用 python 来操作 docx(使用 docx 库操作 docx 格式文件)