C++学习记录001——VS2019报错“C2011 ”tagPOINT“:“struct“类型重定义

博客作者在创建C++动态链接库时遇到问题,尝试仿照MFC的CPoint类定义自己的Point类。由于类中不能直接包含自身类型成员,作者使用结构体解决构造函数问题,但遇到重定义错误。删除结构体定义后,发现VS2019未报错,原来系统已有POINT结构体定义。作者最终决定删除自定义结构体,直接使用内置的POINT,并成功编译。此过程让作者发现并理解了命名冲突的问题。
摘要由CSDN通过智能技术生成

工具:VS2019

背景:想创建一个C++动态链接库,里面需要用到Point类,但是虽然MFC项目里有CPoint类,但是C++动态链接库里面没有现成的Point类,所以,我准备自己仿照MFC中CPoint类的定义重新写一个,结果第一步就报了如题的错误,

代码如下:

/XXXABC.h
#pragma once
#include <iostream>
using namespace std;
typedef struct tagPOINT
{
	LONG x;
	LONG y;
} POINT;

class Point
{
	double X;
	double Y;
	
public:
	Point();    //创建一个未初始化的点
	Point(double X_Position, double Y_Position);  //创建一个已知坐标的点
	Point(POINT pointer);   //由另一个点创造

public:
	double getX();
	double getY();
	void setX(double X_Value);
	void setY(double Y_Value);
	double distance(Point p);

};

因为一般情况下,类中不能定义本身类型的成员(PS:之所以说一般情况,是因为看见有人的类中就定义了本身类型的成员,但是我这个菜鸟不会,所以暂时先不研究人家是怎么实现的,先用最基本的方法),这样的话,我的类中的第三个构造函数“由另一个点创造点”就没法实现。所以就有了前面的struct,这样,我的那个构造函数中就可以用"POINT“了,但就是这样还是报了C2011的错。

//看着不是什么大错,我想着这个问题或许可以解决

我也上网找了一下资料,说把上面代码中类定义部分放到namespace{  },我试了一下,确实没有这个错误了,编译也能通过,但是我在 "XXXABC.cpp"(注意上面代码是在“XXXABC.h”中写的)中去丰富这些函数时,从构造函数开始就报了错(代码就不贴了)。

我想着不这么写了,回头问题越冒越多耽误时间不值得,我决定先舍弃我的第三个构造函数”Point(POINT pointer);“了,然后我就把代码从namespace中移了出来,把结构体部分删掉了,代码如下:

/XXXABC.h
#pragma once
#include <iostream>
using namespace std;
class Point:public tagPOINT
{
	double X;
	double Y;
	
public:
	Point();    //创建一个未初始化的点
	Point(double X_Position, double Y_Position);  //创建一个已知坐标的点
	Point(POINT pointer);   //由另一个点创造

public:
	double getX();
	double getY();
	void setX(double X_Value);
	void setY(double Y_Value);
	double distance(Point p);

};

这一改不得了,我突然发现第三个构造函数中的”POINT“底下竟然没有红色的波浪线,一开始我以为是编译器没反应过来,就“清理解决方案”——>“重新生成解决方案“,竟然也没有报错,可是我确定我代码里没有POINT 的定义,还想这编译器反应也太慢了,都重新生成解决方案了,还是没报错(PS:也不知道我咋想到,咋这么希望人家报错),就把上面这个操作重复做了好几遍,可结果还是编译通过了,我寻思着还是重启吧。

正当我准备退出VS的时候,突然猛地意识到:之前有结构体定义的时候,报错”重定义“,删了之后不报错了,是不是意味着,原本就有个定义好的结构体,我刚好跟人家定义了一模一样的名字,我心里一喜,忙把鼠标放到”POINT"上,“右击”——>“转到定义”,果然看到了对应的定义:

 我还因此因祸得福,发现其他好多类似的定义。

总结:所以,这个问题我的解决方法是,将结构体定义部分直接删掉(既然是“定义”,那必定是定义多了,删了就可,不用想太多,整太多复杂操作)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值