我写了一个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.   

    用using namespace ATL 还不能解决此问题吗?
    那只有在CString全部改为ATL::CString
      

  2.   

    记得C语言里好像有
    #undef
    的预编译头指令
    实施把MFC的CString给除掉
    #if defined (CString)
    #undef CString
    #endif
    好像是这么使,具体的还得问高手
      

  3.   

    如果你是在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改过来
      

  4.   

    其实我解决这个问题的原因,就是想在MFC工程中使用WTL,搞了好久才顺利的让两个类库可以
    混合使用,其实现在我是在做一个大的工程,工程的主框架是MFC搭建的,但是部分界面元素是用WTL 或者.NET 写的。为了能让这三种不通的模块混合使用确实遇到了不少麻烦,不过还好都解决了、
      

  5.   

    如果大家对这种技术敢兴趣,我一个月以后,把这个工程的部门demo代码和界面共享给大家看。
    其实MFC和WTL可以混合的,大家想想他们都是对WIN32的源代码级别上的封装,不过混合的难度就是名字空间的冲突,和部门消息处理上的差别,至于MFC中使用net的组件,如果你了解COM就可以实现了。对于一个分级的程序,我现在的设计是:
    服务端(MFC+STL)来写提高运行效率    界面端使用MFC搭一个多文档的界面,部门元素用WTL 和NET来写提高开发效率,因为数据的展示和参数配置等不是很要求运行效率,这部门主要注意开发效率。 服务器端 和 界面端通过 WEB SERVICES 通讯。如果要求通讯效率的部门的WEB SERVICES 可以使用ATL webservice 来书写