windows.h文件与自定义Rect类的冲突;函数XXX不是类型名;成员的声明与其类具有相同的名称;mysql_com.h 语法错误C2059

切记:自己定义的类千万别和系统中的windows.h或者其他冲突,否则不显示具体的错误。排查较为麻烦。

在上一篇博客中介绍了如何使用C++连接到数据库C++连接MySQL数据库

但是在我使用时候发生了一个奇怪的错误,如下图所示,

windows.h文件与自定义Rect类的冲突;函数XXX不是类型名;成员的声明与其类具有相同的名称;mysql_com.h 语法错误C2059

                                                                                         1.运行前的错误

windows.h文件与自定义Rect类的冲突;函数XXX不是类型名;成员的声明与其类具有相同的名称;mysql_com.h 语法错误C2059

                                                                                        2:运行时的错误

问题分析:本来是可以正常运行的,经过排查出现了以上错误是由于include两个头文件()造成的

#include <windows.h>
#include <winsock.h>

#include <windows.h>
#include <winsock.h>

出现了以上问题,想过替换掉这两个头文件,但是实际上加入这两个头文件是由于MySQL.h头文件需要的,所以并不能替换。否则mysql.h将会报以下错误。

windows.h文件与自定义Rect类的冲突;函数XXX不是类型名;成员的声明与其类具有相同的名称;mysql_com.h 语法错误C2059

#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <winsock.h>
#include <mysql.h>

于是寻找别的解决方法,最后看到网上说是由于windows.h文件冲突造成的,我以为是windows.h头文件和Rect有冲突需要引入全路径才可以。于是按照网上的教程

#include "c:\Program Files (x86)\Windows Kits\8.1\Include\um\Windows.h"
#include "c:\Program Files (x86)\Windows Kits\8.1\Include\um\winsock.h"

但是结果都是一样的不行。

解决方法:

最后实在没有办法,我将Rectangle替换成Rect虽然编译期没有报错但实际也没有结果。但是我发现这是由于window.h中包含Rect,所以导致的重名冲突,依据如下:

错误的定义指向:

windows.h文件与自定义Rect类的冲突;函数XXX不是类型名;成员的声明与其类具有相同的名称;mysql_com.h 语法错误C2059

正确的定义指向:

windows.h文件与自定义Rect类的冲突;函数XXX不是类型名;成员的声明与其类具有相同的名称;mysql_com.h 语法错误C2059

 至此,问题就可以解决了:

1修改类名Rectangle改成了Rectangles。

2、修改方法名,near修改成nears。

3、项目内全替换以上变量。