You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 05:23:24