描述:
我写了一个MFC lib其中需要一些第三方用ATL写的类,类中使用了ATL::CString
这些代码不可以修改。为了使用这些类,我做了如下处理
stdafx.h 中做了如下定义:
#define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将为显式的
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料
#endif
#include <afx.h>
#include <afxwin.h> // MFC 核心组件和标准组件
#include<commctrl.h>
#include <atlbase.h>
#include <atlcoll.h>// CAtlMap CAtlList
#include <atlstr.h>
#include <atltypes.h>
namespace ATL
{ typedef ATL::CAtlStringW CStringW;
typedef ATL::CAtlStringA CStringA;
typedef ATL::CAtlString CString;
}
但是程序编译的时候提示我 error C2872: “CString” : 不明确的符号
也就是我工程中
。。。
CString m_str;
这种定义编译系统不知道CString 是 ATL::CString 还是MFC定义的CString .(MFC 也定义了CString)
但是MFC是在全局域中定义了CString .所以这种冲突发生的原因也就是有的头文件把ATL 这个域导入了全局域(例如通过using namespace ATL)
不知道如何处理(只在stdafx.h) 能避免这种冲突?
解决方案1:
如果你是在VC7下使用第三方的ATL7.0的类,不会存在命名空间冲突,因为CString从MFC7.0中独立出来了(见头文件afxstr.h),ATL和MFC的混合使用实际上用的是一套CString.而且你上面的重定义
namespace ATL
{ typedef ATL::CAtlStringW CStringW;
typedef ATL::CAtlStringA CStringA;
typedef ATL::CAtlString CString;
}不应该、也没必要,反而破坏了两者的兼容性
如果你是在VC6或以下的版本中使用第三方的ATL7.0的类,那就不好办了。你只好把ATL的CString 定义成其他的名字 CMyAtlString来使用,并将第三方的CString改过来
记得C语言里好像有
#undef
的预编译头指令
实施把MFC的CString给除掉
#if defined (CString)
#undef CString
#endif
好像是这么使,具体的还得问高手
学习……
解决方案4: 用using namespace ATL 还不能解决此问题吗?
那只有在CString全部改为ATL::CString