为啥我收到此代码的错误? [复制]
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 ParseA 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
的函数声明。以上是关于为啥我收到此代码的错误? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不断收到此错误:SQL 命令未正确结束以插入值? [复制]
谁能告诉我为啥我从 GitLab 收到此“错误:作业失败:退出代码 1”消息?
为啥我在使用 Java (Netbeans) 连接到 MySQL 时收到此错误“通信链接失败最后发送的数据包...”? [复制]