Dav*_*eer 9 c++ namespaces forward-declaration
我正在使用一个C++第三方库,它将所有类放在一个版本化的命名空间中,让我们调用它tplib_v44
.它们还定义了通用名称空间别名:
namespace tplib = tplib_v44;
Run Code Online (Sandbox Code Playgroud)
如果使用通用命名空间在我自己的.h文件中正向声明库的成员...
namespace tplib { class SomeClassInTpLib; }
Run Code Online (Sandbox Code Playgroud)
...我在第三方库的头文件中遇到编译器错误(稍后将在我的.cpp实现文件中包含):
error C2386: 'tplib' : a symbol with this name already exists in the current scope
Run Code Online (Sandbox Code Playgroud)
如果我使用特定于版本的命名空间,那么一切正常,但那么......重点是什么?处理这个问题的最佳方法是什么?
[编辑]仅供未来观众使用,这是ICU图书馆.解决方案(至少在我的情况下)是对已接受答案的评论.
看起来有一个丑陋的解决方法,但没有好的解决方案。
对于ACE(有一个不错的解释)和Xerces(有一个尖锐的“这就是 c++ 的工作原理”注释),它们定义了可以用来“一般”执行此操作的宏。
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
class ACE_Reactor;
ACE_END_VERSIONED_NAMESPACE_DECL
XERCES_CPP_NAMESPACE_BEGIN
class DOMDocument;
class DOMElement;
XERCES_CPP_NAMESPACE_END
Run Code Online (Sandbox Code Playgroud)
它看起来像是一个不幸的 C++ 工件,请尝试在您的环境中搜索tplib
这些宏。
该标准将命名空间和命名空间别名视为不同的事物。您声明tplib
为名称空间,因此当编译器稍后尝试分配别名时,它不能同时是两者,因此编译器会抱怨。