Вопрос по c++, namespaces – Импорт вложенных классов в пространство имен - C ++

20

Скажем, у меня есть такой класс:

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

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

using A::B;

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

@Johnsyweb да. Baruch
@iammilind, но вы можете добиться такого поведения с помощью обходного пути. Eitan T
Была ли ошибка компиляции, & quot; ошибка: & # x2018; A & # x2019; не является пространством имен & quot ;? Johnsyweb
Вы не можете сделать это дляA::f(). iammilind

Ваш Ответ

3   ответа
32

Вот два обходных пути для вашей проблемы:

1) Класс Б:

typedef A::B B;

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

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

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

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

Дляtypedefили жеusing решения, есть идеи, чтобы он работал даже с частным вложенным классом?
16

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

using B = A::B;

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

Edit: В соответствии сэтот SO-ответ (в чем разница между «typedef» и «using» в C ++ 11) этотshould быть действительным, и фактически создает псевдоним типа так же, какtypedef делает. Однако это только C ++ 11.

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

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

auto bar = Foo::bar;

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

void (*bar)() = Foo::bar;
1.cpp: 9: 7: ошибка: ожидаемый спецификатор вложенного имени перед «B»; используя B = A :: B;(gcc.EXE (GCC) 4.8.0)
using B = A::B; Это не будет работать. Другое дело, что указатели на функции не могут быть встроены.
этот также не работает для меня GCC 4.4.6
@SergeyK. У меня отлично работает, с GCC 4.7.1. Но вы правы насчет врезки.
@SergeyK. На самом деле,using Синтаксис ключевых слов является допустимым в C ++ 11. При компиляции с GCC вы использовали-std=c++11 или же-std=c++0x флаги?
8

Вы можетеtypedef

typedef A::B B;
Вы также можете создатьf() в глобальном пространстве имен, которое вызываетA::f().

Похожие вопросы