Почему я не могу помещать объявление "using" внутри объявления класса?

Я понимаю проблемы, с которыми вы можете столкнуться, когда вы помещаете объявление using внутри заголовочного файла, поэтому я не хочу этого делать. Вместо этого я попытался поместить using (или namespace foo =) в объявление класса, чтобы сократить повторную типизацию в файле заголовка. К сожалению, я получаю ошибки компилятора. Похоже, это была бы полезная функция.

#ifndef FOO_H
#define FOO_H

// This include defines types in namespace gee::whiz::abc::def,
// such as the class Hello.
#include "file_from_another_namespace.h"

// using namespace gee::whiz::abc::def; // BAD!

namespace x {
   namespace y {
      namespace z {

struct Foo {
    using namespace gee::whiz::abc::def; // Illegal.
    namespace other = gee::whiz::abc::def; // Illegal.

    // Foo(gee::whiz::abc::def::Hello &hello); // annoyingly long-winded

    Foo(other::Hello &hello); // better
    //...
};

} } } // end x::y::z namespace

#endif // FOO_H

В реальном коде имена имен пространства намного дольше и раздражают, и это не то, что я могу изменить.

Может ли кто-нибудь объяснить, почему это не является законным или (лучше), если есть обходной путь?

Ответы

Ответ 1

Не могли бы вы сделать typedef gee::whiz::abc::def::Hello Hello?

Ответ 2

на самом деле не совсем ужасная идея. Это по крайней мере имеет такое же значение, как и то, как это работает сейчас (что дано, не так много). Я думаю, что основная проблема заключается в том, что классы не являются единицей компиляции и связывания, а "единицами перевода". Но делать это класс за классом гораздо чище, имея классы - модули, такие как Java или С# или другие языки, которые имеют больше смысла.

Ответ 3

Имел ту же проблему, нашел этот вопрос. Я понял, что если вы оберните struct foo анонимным пространством имен, кажется, вы можете поместить

с использованием пространства имен тоже:: many:: names;

вверху анонимной обертки. Тем не менее, это уродливо, добавляя больше слоев вложенных брекетов.