以下代码无法编译,因为编译器不知道foo::bar它何时遇到它.
class foo : foo::bar {
class bar {
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让这个代码(或它的一些变体)编译?
如果继承来自bar实现细节,并且目标是避免污染全局命名空间(或库的命名空间),则通常的方法是将这些实现细节放在名为的命名空间中detail.例如,这是像Boost这样的库中使用的约定.
namespace super_cool_library {
namespace detail {
class bar { };
}
class foo : detail::bar {
};
}
Run Code Online (Sandbox Code Playgroud)
该detail命名空间是无可否认,只是一个约定,但大多数人都明白,在所述命名空间有怪物.
编辑:
由于埃米利奥加拉瓦利亚表明,foo需要交好detail::bar是否detail::bar应该需要有相同的访问foo是一个C++ 11的内部类会有.