C++命名空间别名和转发声明

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图书馆.解决方案(至少在我的情况下)是对已接受答案的评论.

Ste*_*hen 4

看起来有一个丑陋的解决方法,但没有好的解决方案。

对于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为名称空间,因此当编译器稍后尝试分配别名时,它不能同时是两者,因此编译器会抱怨。