移植旧代码时如何处理类名冲突?

时间:2008-10-10 02:32:50

标签: c++ namespaces ambiguity

我正在尝试将一个旧库(尽管我没有使用名称空间)移植到现代编译器中。我的一个目标无法区分System :: TObject和:: TObject(没有命名空间)。 System :: TObject是编译器的原生。

我尝试了一个using指令,即使用:: TObject;

但那不行。

显而易见的解决方案是将所有原始库包装在命名空间中,然后通过名称调用它 - 这应该避免歧义。但这是最明智的解决方案吗?还有其他解决方案吗?添加命名空间需要更改一堆文件,我不知道以后是否会产生不必要的后果。

5 个答案:

答案 0 :(得分:3)

您可以像Dib建议的那样做,稍作修改:

// In a wrapper header, eg: include_oldlib.h...

namespace oldlib
{
   #include "oldlib.h"
};

#ifndef DONT_AUTO_INCLUDE_OLD_NAMESPACE
using namespace oldlib;
#endif

这允许您#define仅在您遇到冲突的文件中排除,否则使用所有符号作为全局符号。

答案 1 :(得分:1)

您可以为所有旧函数创建一个包装器,并将它们打包到DLL或静态库中。

答案 2 :(得分:0)

如果您拥有该库的源代码,可能在该头文件所在的每个源的顶部都包含一个头文件:

#define TObject TMadeUpNameObject

答案 3 :(得分:0)

试试这个:

namespace oldlib
{
   #inclcude "oldlib.h"
};

答案 4 :(得分:0)

我在过去使用了以下内容,同时封装了包含与代码冲突的类的第三方头文件:

#ifdef Symbol
#undef Symbol
#define Symbol ThirdPartySymbol
#endif
#include <third_party_header.h>
#undef Symbol

这样,标题中的“符号”以ThirdParty为前缀,这与我的代码没有冲突。