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