Можно ли «импортировать» одно пространство имен в другое в заголовке? - PullRequest
3 голосов
/ 10 мая 2019

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 * для 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 к каждому .cpp файлу, который включает в себя Bar.h (это результат попытки рефакторинга библиотеки, вытаскивая часть Bar в Foo, многие .cpp файлы уже включают Bar.h).

Неформально я рассматриваю это как "импорт" Foo::Inner в Bar::Inner, отсюда и название вопроса. Что я на самом деле имею в виду:

Могу ли я добавить что-то в Bar.h, что позволит мне ссылаться на перегрузки в Foo::Inner как Inner::stuff везде, где действует using namespace Bar?

Ответы [ 3 ]

4 голосов
/ 10 мая 2019

Используйте

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

до main. Смотрите живой пример здесь

4 голосов
/ 10 мая 2019

Вы можете разместить с помощью Bar::Inner:

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

Таким образом обе перегрузки можно отнести к Bar::Inner::func.

2 голосов
/ 10 мая 2019

Запись

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

чуть выше main делает это.Если вы хотите ввести только определенные символы, напишите using Foo::Inner::func & c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...