我可以将一个名称空间“导入”标题中的另一个名称空间吗?

时间:2019-05-10 11:22:37

标签: c++ namespaces

Foo.h

namespace Foo
{
    namespace Inner
    {
        void func (int *);
    }
}

Bar.h

#include <Foo.h>

namespace Bar
{
    namespace Inner
    {
        void func (float *);
    }
}

main.cpp

#include <Bar.h>

using namespace Bar;

int main ()
{
    int i;
    float f;

    Inner::func (&i);
    Inner::func (&f);
}

main中,float *的{​​{1}}重载无需使用func命名空间限定符,但是Bar::重载需要一个int *命名空间限定词。

我知道我可以

Foo::

不是想要这个,我想分别引用using namespace Foo::Inner; using namespace Bar::Inner; int main () { int i; float f; func (&i); func (&f); }

我也不想将Inner::func添加到每个包含using namespace Foo的{​​{1}}文件中(这是库重构工作的结果,将.cpp中的一些删除了到Bar.h中,许多Bar文件已经包含Foo)。

我非正式地将此视为“ .cpp导入” Bar.h,因此是问题标题。我真正的意思是:

是否可以在Foo::Inner生效的地方向Bar::Inner添加一些内容,以便让我将Bar.h中的Foo::Inner中的重载称为?

3 个答案:

答案 0 :(得分:4)

您可以使用Bar::Inner中放置

namespace Bar
{
    namespace Inner
    {
        using Foo::Inner::func;
        void func (float *);
    }
}

这样,两个重载都可以用Bar::Inner::func引用。

答案 1 :(得分:4)

使用

namespace Inner {
  using namespace Foo::Inner;
  using namespace Bar::Inner;
}

main之前。查看现场示例here

答案 2 :(得分:2)

写作

namespace Inner
{
    using namespace Foo::Inner;
    using namespace Bar::Inner;
}

正好位于main上方。如果您只想输入特定的符号,请输入using Foo::Inner::func&c。