为何MSVC误判printcmon函数参数类型为int而非cmon指针?
问题:MSVC将printcmon参数识别为int而非cmon类指针
学习隐式this指针用法时,无法理解为何MSVC编译器始终将printcmon()函数的参数类型识别为int,而非cmon类指针。
代码示例
void printcmon(const cmon* e); class cmon { public: int x, y; cmon(int x, int y) { this->x = x; this->y = y; printcmon(this); } int getX() const { const cmon* e = this; std::cout << e->x << std::endl; return 0; } }; void printcmon(const cmon* e) { //stuff }
报错信息
error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认-int error C2143: 语法错误: 缺少“,”(在“*”之前) error C2664: “void printcmon(const int)”: 无法将参数 1 从“cmon *”转换为“const int” message : 没有可执行该转换的上下文 message : 参见“printcmon”的声明 message : 尝试匹配参数列表“(cmon *)”时
原因与解决方案
问题出在函数声明的时机:你在cmon类定义之前声明了printcmon(const cmon* e),但此时编译器还不知道cmon是什么类型——它既不是基本类型,也没有提前声明,所以编译器会默认把未知的cmon当成int,导致后续所有相关报错。
解决方法有两种:
- 方法一:提前声明
cmon类
在printcmon的函数声明前,先加一行类的前置声明,让编译器知道cmon是一个类类型:class cmon; // 前置声明 void printcmon(const cmon* e); class cmon { // ... 类内容不变 }; - 方法二:把
printcmon的声明移到cmon类定义之后
这样当编译器看到printcmon的参数是const cmon*时,已经知道cmon类的完整定义,不会出现类型识别错误。
内容的提问来源于stack exchange,提问作者George kirby
相关产品推荐
相关产品推荐

