为啥我收到此代码的错误? [复制]

Posted

技术标签:

【中文标题】为啥我收到此代码的错误? [复制]【英文标题】:Why am i getting error for this code? [duplicate]为什么我收到此代码的错误? [复制] 【发布时间】:2014-01-24 18:51:29 【问题描述】:

谁能告诉我为什么编译器会为此报错。

class A

private:
 int data;
public:
 A();
 A(A& a)  this->data = a.data; 
;

void main()

 A a();
 A b(a);

我得到的错误是这样的。

error C2664: 'A::A(A &)' : cannot convert parameter 1 from 
 'A (__cdecl *)(void)' to 'A &'

【问题讨论】:

Most Vexing Parse A a(); 是一个函数声明... @andre:是的,它可以,它在同一个类中。 A 可以访问 A 对象的私有成员。编辑:忍者 试试searching。 【参考方案1】:
A a();

这是一个函数的前向声明,它返回一个 A 并且不接受任何参数。因此,您正在尝试将函数指针传递给您的构造函数,这当然不起作用,因为不存在这样的构造函数。如果要使用默认构造函数,请使用:

A a;

当然,构造函数没有定义。你需要添加一个定义(你只写了一个声明)。

顺便说一句; main 被定义为返回一个 int,你应该在你的构造函数中使用一个 const 引用。

A(const A &other) : data(other.data) 

【讨论】:

这被称为“最令人烦恼的 Parse” @JohnDibling:不是“最令人烦恼的解析”。只是“恼人的解析”。最烦人的解析是这样的:A a(A());【参考方案2】:

首先它应该是int main(),其次构造函数`A()没有主体

也应该是A a; 而不是A a();

编辑

最好还是A(A& a) this->data = a.data; 应该改为A(const A& a) this->data = a.data;

【讨论】:

第二行不应该是A b(&a)吗?只是猜测,我对 C++ 完全陌生。 @ThomasW.:不,这会产生一个指针。传递引用不需要特殊语法。 @ThomasW。没有。 &a 返回一个指针,实际上是 A* 类型。 b 的类型是 A。您不能使用非指针类型初始化指针。类型必须匹配。我们使用A b(a),因为b 将使用a 的副本进行初始化。 回应您的编辑:除此之外,您应该使用成员初始化列表A(const A& a) : data(a.data) 【参考方案3】:

试试这个:

class A

public:
  int data;
public:
  A()this->data = 0;
  A(A& a)  this->data = a.data; 
;

int main()

  A a;
  A b(a);

在 Main 中,声明

A a();

改为:

A a;

因为编译器试图将括号识别为不存在的运算符。 “默认”构造函数已更改,因为链接器无法识别该符号已被使用。您可以通过在基类中编程来覆盖此行为,该基类利用其构造函数中的数据字段。

【讨论】:

编译器认为它不是一个操作符,它把它解析为一个不带参数并返回类型A的函数声明。

以上是关于为啥我收到此代码的错误? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在此代码中收到 SIGABRT 错误 [关闭]

为啥我不断收到此错误:SQL 命令未正确结束以插入值? [复制]

为啥我在尝试创建此表时不断收到外键错误? [复制]

谁能告诉我为啥我从 GitLab 收到此“错误:作业失败:退出代码 1”消息?

为啥我在 facenet 中收到此错误?

为啥我在使用 Java (Netbeans) 连接到 MySQL 时收到此错误“通信链接失败最后发送的数据包...”? [复制]