分页: 1 / 1

[已解决][问题]g++没有匹配函数。。。

发表于 : 2008-05-29 1:42
Final_x
知道的DX帮帮忙看看...必终生景仰之!!

如下,我用g++编译这个程序(课本上的源程序):

代码: 全选

#include <iostream>
using namespace std;

class Point		//类的定义
{
public:			//外部接口
	Point(int xx=0,int yy=0){X=xx;Y=yy;cout<<"构造函数被调用"<<endl;}		//带默认形参的构造函数
	Point(Point &p);	//拷贝构造函数的声明
	int GetX(void){return X;}
	int GetY(void){return Y;}
private:		//私有数据成员
	int X,Y;
};

Point::Point(Point &p)
{
	X=p.X;
	Y=p.Y;
	cout<<"拷贝构造函数被调用"<<endl;
}

Point fun2(void)
{
	Point p(8,9);
	cout<<"in fun2:"<<"p的坐标为:"<<p.GetX()<<','<<p.GetY()<<endl;
	return p;
}

int main()
{
	Point A(1,2);
	Point B(4,5);
	Point C;
	C=fun2();
	cout<<"A的坐标为:"<<A.GetX()<<','<<A.GetY()<<endl;
	cout<<"B的坐标为:"<<B.GetX()<<','<<B.GetY()<<endl;
	cout<<"C的坐标为:"<<C.GetX()<<','<<C.GetY()<<endl;
	return 0;
}
g++编辑器提示如下错误:

代码: 全选

4-2point类.cpp: In function ‘int main()’:
4-2point类.cpp:35: 错误: 对‘Point::Point(Point)’的调用没有匹配的函数
4-2point类.cpp:16: 附注: 备选为: Point::Point(Point&)
4-2point类.cpp:8: 附注:          Point::Point(int, int)

然后我把C=fun2()这行注释掉,再把倒数第三行改成

代码: 全选

cout<<"C的坐标为:"<<fun2().GetX()<<','<<fun2().GetY()<<endl;
程序变成

代码: 全选

#include <iostream>
using namespace std;

class Point		//类的定义
{
public:			//外部接口
	Point(int xx=0,int yy=0){X=xx;Y=yy;cout<<"构造函数被调用"<<endl;}		//带默认形参的构造函数
	Point(Point &p);	//拷贝构造函数的声明
	int GetX(void){return X;}
	int GetY(void){return Y;}
private:		//私有数据成员
	int X,Y;
};

Point::Point(Point &p)
{
	X=p.X;
	Y=p.Y;
	cout<<"拷贝构造函数被调用"<<endl;
}

Point fun2(void)
{
	Point p(8,9);
	cout<<"in fun2:"<<"p的坐标为:"<<p.GetX()<<','<<p.GetY()<<endl;
	return p;
}

int main()
{
	Point A(1,2);
	Point B(4,5);
	Point C;
//	C=fun2();
	cout<<"A的坐标为:"<<A.GetX()<<','<<A.GetY()<<endl;
	cout<<"B的坐标为:"<<B.GetX()<<','<<B.GetY()<<endl;
	cout<<"C的坐标为:"<<fun2().GetX()<<','<<fun2().GetY()<<endl;
	return 0;
}
编译却可以通过了,结果为:

代码: 全选

构造函数被调用
构造函数被调用
构造函数被调用
A的坐标为:1,2
B的坐标为:4,5
构造函数被调用
in fun2:p的坐标为:8,9
构造函数被调用
in fun2:p的坐标为:8,9
C的坐标为:8,9
 
看来错误出在

代码: 全选

C=fun2();
这行上面
我把这个g++调试不过的程序发给群里一个正在用VC的朋友,却可以编译通过。。
我是c++和g++新手,不知道为什么g++会给我这个错误提示,DX给帮帮忙,谢谢!!

发表于 : 2008-05-29 10:03
linser
把构造函数 Point(Point &p) 改成 Point(const Point &p)

发表于 : 2008-05-29 16:57
Final_x
linser 写了:把构造函数 Point(Point &p) 改成 Point(const Point &p)
是声明成常对象么?可以说明一下为什么用g++编译要加const么?
谢谢。。。。

发表于 : 2008-05-29 17:31
Final_x
linser 写了:把构造函数 Point(Point &p) 改成 Point(const Point &p)
谢谢linser,我知道原因了,答案在这里:http://topic.csdn.net/u/20070104/15/3ad ... 10c0f.html

希望对以后遇到这种问题的朋友可以有所帮助。。

发表于 : 2008-05-29 22:50
Final_x
再问linser:
我们现在在学的教材上用的是vc++6.0,
以后编程我都会在linux下用g++的,我想知道的是除了上面那个问题以外其他方面
g++和vc在代码书写上有什么不一样的标准了么?
谢谢

发表于 : 2008-05-30 14:51
yangcheng
vc 6不标准
vc 7以上的话 大部分纯c++代码应该和gcc 4.0以上兼容。

发表于 : 2008-06-01 19:36
Final_x
谢谢回答!

发表于 : 2008-06-15 11:27
fuhuizn
是不是因为没有重载“=”号

发表于 : 2008-06-15 14:39
fuhuizn
经试验:
用gcc4时“拷贝构造函数”并不能像标准所说的那样起作用,必须重载“=”。

发表于 : 2008-07-05 13:31
Final_x
fuhuizn 写了:是不是因为没有重载“=”号
最近宿舍宽带时间用完了所以也好久都没有上来看看了

关于是否要重载"=",觉得应该和这个没有关系吧,因为我做的是简单的整形赋值,没有设计到对象的拷贝构造的调用

发表于 : 2008-07-05 13:59
ChloeRei

代码: 全选

Point C;
C=fun2(); 
这里是先调用拷贝函数把fun2() 里面return的那个东西传出来。
再调用赋值函数operator=

:shock: 这里不定义也会自动生成……阿原来LS已经有结果了