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

软件和网站开发以及相关技术探讨
回复
头像
Final_x
帖子: 383
注册时间: 2008-05-03 23:05
联系:

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

#1

帖子 Final_x » 2008-05-29 1:42

知道的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给帮帮忙,谢谢!!
上次由 Final_x 在 2008-06-01 19:37,总共编辑 4 次。
linser
帖子: 243
注册时间: 2005-09-28 9:03

#2

帖子 linser » 2008-05-29 10:03

把构造函数 Point(Point &p) 改成 Point(const Point &p)
头像
Final_x
帖子: 383
注册时间: 2008-05-03 23:05
联系:

#3

帖子 Final_x » 2008-05-29 16:57

linser 写了:把构造函数 Point(Point &p) 改成 Point(const Point &p)
是声明成常对象么?可以说明一下为什么用g++编译要加const么?
谢谢。。。。
头像
Final_x
帖子: 383
注册时间: 2008-05-03 23:05
联系:

#4

帖子 Final_x » 2008-05-29 17:31

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

希望对以后遇到这种问题的朋友可以有所帮助。。
头像
Final_x
帖子: 383
注册时间: 2008-05-03 23:05
联系:

#5

帖子 Final_x » 2008-05-29 22:50

再问linser:
我们现在在学的教材上用的是vc++6.0,
以后编程我都会在linux下用g++的,我想知道的是除了上面那个问题以外其他方面
g++和vc在代码书写上有什么不一样的标准了么?
谢谢
头像
yangcheng
帖子: 498
注册时间: 2005-09-27 18:24
来自: 杭州

#6

帖子 yangcheng » 2008-05-30 14:51

vc 6不标准
vc 7以上的话 大部分纯c++代码应该和gcc 4.0以上兼容。
头像
Final_x
帖子: 383
注册时间: 2008-05-03 23:05
联系:

#7

帖子 Final_x » 2008-06-01 19:36

谢谢回答!
fuhuizn
帖子: 948
注册时间: 2006-01-06 22:55
系统: ubuntu
联系:

#8

帖子 fuhuizn » 2008-06-15 11:27

是不是因为没有重载“=”号
上次由 fuhuizn 在 2008-06-15 14:40,总共编辑 1 次。
fuhuizn
帖子: 948
注册时间: 2006-01-06 22:55
系统: ubuntu
联系:

#9

帖子 fuhuizn » 2008-06-15 14:39

经试验:
用gcc4时“拷贝构造函数”并不能像标准所说的那样起作用,必须重载“=”。
头像
Final_x
帖子: 383
注册时间: 2008-05-03 23:05
联系:

#10

帖子 Final_x » 2008-07-05 13:31

fuhuizn 写了:是不是因为没有重载“=”号
最近宿舍宽带时间用完了所以也好久都没有上来看看了

关于是否要重载"=",觉得应该和这个没有关系吧,因为我做的是简单的整形赋值,没有设计到对象的拷贝构造的调用
头像
ChloeRei
帖子: 1021
注册时间: 2007-11-23 9:49

#11

帖子 ChloeRei » 2008-07-05 13:59

代码: 全选

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

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