C++ 是否有可能避免C++;编译器错误(C2757),其中两个不同的头文件包含相同的名称空间符号&;上课?

C++ 是否有可能避免C++;编译器错误(C2757),其中两个不同的头文件包含相同的名称空间符号&;上课?,c++,C++,在对现有库实现一些新代码时,我面临一个问题。此库已引用名为“foo”的类。相同的名称用作另一个头文件中的名称空间,为了实现新功能,必须包含该头文件。因为这两个头文件都是遗留代码库的一部分,所以我无法修改它们。因此,我在这里寻找任何方法来避免编译器错误(C2757:具有此名称的符号已经存在,因此此名称不能用作命名空间名称)。我不确定这是否可能。因此,任何帮助都将不胜感激。谢谢 为清楚起见,以下是该问题的示例代码说明: 海德拉 class foo {} 校长B.h namespace foo {

在对现有库实现一些新代码时,我面临一个问题。此库已引用名为“foo”的类。相同的名称用作另一个头文件中的名称空间,为了实现新功能,必须包含该头文件。因为这两个头文件都是遗留代码库的一部分,所以我无法修改它们。因此,我在这里寻找任何方法来避免编译器错误(C2757:具有此名称的符号已经存在,因此此名称不能用作命名空间名称)。我不确定这是否可能。因此,任何帮助都将不胜感激。谢谢

为清楚起见,以下是该问题的示例代码说明:

海德拉

class foo
{}
校长B.h

namespace foo
{
class ABC{}
}
校长

#include <HeaderA.h>
#include <HeaderB.h>
using namespace foo;

class Toimplement{
ABC a; //Throws Error C2757
}
#包括
#包括
使用名称空间foo;
类到实现{
ABC a;//抛出错误C2757
}

在新名称空间中包含一个头文件

namespace headerb {  
   #include <HeaderB.h>  
}  
...  
...  
headerb::ABC a1;
ABC b2;
namespace headerb{
#包括
}  
...  
...  
校长B::ABC a1;
ABC b2;

您可以尝试以下解决方法:

namespace bar {
    #include "HeaderA.h"
}
#include "HeaderB.h"

...
bar::foo fooObject;
foo::ABC abcObject;

在您的示例中,最简单的方法是在
HeaderC.h
中不包含
HeaderA.h
。在实现中不需要foo类。

因此,假设您需要这两个文件的可见性,并且希望链接到HeaderA包含的符号:

// header a
class FOO {};

// followed by a file with your declarations/disambiguators
typedef FOO wwlib_FOO;

// header b
namespace FOO {class ABC {};}

// followed by a file with your declarations/disambiguators
namespace vvlib_FOO = FOO;

// and finally usage
using namespace FOO; // note: using `using` is a good way to introduce complications like this one

void fn() {
    class FOO t;
    wwlib_FOO t2(t);
    vvlib_FOO::ABC abc;
...

除了非常简单的情况(除非完全是模板或内联线,这是非常不寻常的),名称空间技巧不会起作用。您最终只会得到重复的代码、无法传递的类,以及在链接时丢失的引用。

基本上就是这样。包括你需要的,不要包括你不需要的。我不能阻止这一点,因为我说过这是一个旧代码,他们正在当前类的其他部分使用HeaderA.h的一些类。这很快!我创建了一个新的名称空间,它工作正常!对于其他静态值,我收到了一些类似的引用错误,但在添加名称空间之后,一切都很好。再次感谢。