无法将参数1从'Object *'转换为'const int

问题描述 投票:-1回答:2

我想创建一个简单的程序来演示此用法。我写了一个打印x和y成员变量的函数。我在文件顶部定义了函数。我什至根本不知道为什么需要这样做,但是还可以。到目前为止,一切都很好。 Visual Studio发现零问题,没有警告,也没有错误。但是,当我编译此代码时,出现以下错误消息:

1> D:\ Dev \ Visual Studio Projekte \ Projektmappe \ FirstProject \ src \ This.cpp(3,30):错误C2143:语法错误:在'*'之前缺少','1> D:\ Dev \ Visual Studio Projekte \ Projektmappe \ FirstProject \ src \ This.cpp(11,1):错误C2664:'void PrintObject(const int)':无法将参数1从'Object *'转换为'const int'

现在,在某些时候,我还得到一个错误,即未定义默认构造函数。但是编译器确实提供了一种权利吗?然后,我简单地重新输入代码,错误消失了。我想提的那件事似乎也很愚蠢。那么,为什么编译器实际上是在引用我的对象时认为“ this”是在引用“ const int”?

#include <iostream>

void PrintObject(const Object* o);

class Object {
public:
    int x, y;

    Object(int x, int y)
        : x(x), y(y) {
        PrintObject(this);
    }


    int GetX() const {
        return this->x;
    }

    int GetXy() const {
        return x;

    }

};

void PrintObject(const Object* o) {
    std::cout << o->x << ", " << o->y << std::endl;
}

int main() {


    std::cin.get();
    return 0;
}
c++ this
2个回答
1
投票
void PrintObject(const Object* o);

您尚未声明Object,因此编译器无法知道它是什么。在删除此功能之前,必须先声明该类。


0
投票

非常简单,在声明之前,您正在使用Object。因此,编译器在读取Object的声明时并不知道PrintObject是什么。

两种可能的解决方案。

1)将PrintObject的声明移到Object的定义之后。

class Object
{
    ...
};

void PrintObject(const Object* o);

2)使用转发声明告诉编译器Object是类的名称。

class Object; // forward declaration

void PrintObject(const Object* o);

class Object
{
    ...
};
© www.soinside.com 2019 - 2024. All rights reserved.