Импортировать вложенные классы в пространство имен - С++

Скажем, у меня есть класс вроде этого:

class A {
public:
    class B {
        // ...
    };
    static void f();
    // ...
};

Я могу ссылаться на B как A::B и на f() как A::f(), но могу ли я импортировать B и f() в глобальное/текущее пространство имен? Я попробовал

using A::B;

но это дало мне ошибку компиляции.

Ответы

Ответ 1

Вы должны иметь возможность использовать псевдонимы пространства имен для класса:

using B = A::B;

Однако вы не можете сделать это с помощью функции-члена, даже со статическими функциями-членами.

Изменить: По этот ответ SO (в чем разница между 'typedef' и 'using' в С++ 11) это должно быть действительным и фактически создает псевдоним типа так же, как это делает typedef. Однако это только С++ 11.


Существует временное решение для статических функций-членов в С++ 11, объявляя переменную, указывающую на статическую функцию:

struct Foo
{
    static void bar()
        { }
};

auto bar = Foo::bar;

Изменить: Конечно, наличие глобальной переменной, указывающей на статическую функцию-член, возможно и в старом стандарте С++, но это более беспорядочно, чем использование ключевого слова auto на С++ 11. В приведенном выше примере это будет:

void (*bar)() = Foo::bar;

Ответ 2

Вот два способа обхода проблемы:

1) Класс B:

typedef A::B B;

2) Функция f():

inline void f()
{
    A::f();
}

Но подумайте дважды, прежде чем использовать их.

Изменить: В С++ 11 вы можете сделать auto f = A::f;, но это фактически создает указатель на функцию, а указатели функций не могут быть встроены.

Ответ 3

Вы можете typedef

typedef A::B B;