Почему я не могу поместить объявление "using" в объявление класса? - PullRequest
18 голосов
/ 25 января 2010

Я понимаю проблемы, с которыми вы можете столкнуться, когда поместите объявление 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

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

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

Ответы [ 3 ]

24 голосов
/ 25 января 2010

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

4 голосов
/ 25 января 2010

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

1 голос
/ 02 декабря 2010

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

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

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

...