2010-01-25 9 views
15

Rozumiem, jakie problemy można napotkać po umieszczeniu deklaracji using w pliku nagłówkowym, więc nie chcę tego robić. Zamiast tego próbowałem umieścić using (lub namespace foo =) w deklaracji klasy, aby ograniczyć powtarzalne pisanie w pliku nagłówkowym. Niestety otrzymuję błędy kompilatora. Wydaje się, że byłoby to przydatną funkcją.Dlaczego nie mogę umieścić deklaracji "using" w deklaracji klasy?

#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 

W kodzie rzeczywistym nazwy przestrzeni nazw są znacznie dłuższe i denerwujące i nie jest to coś, co mogę zmienić.

Czy ktoś może wyjaśnić, dlaczego nie jest to zgodne z prawem lub (lepiej), jeśli istnieje obejście problemu?

Odpowiedz

21

Czy możesz zrobić typedef gee::whiz::abc::def::Hello Hello?

+2

To nadal będzie zanieczyszczać przestrzeń nazw, której stara się uniknąć. – Trent

+6

Nie, jeśli jest używany w deklaracji klasy. –

+0

Tak, to działa! A jeśli zrobię to jako prywatny typ, to inny kod nie może go użyć przypadkowo. – Dan

4

w rzeczywistości nie jest to całkowicie okropny pomysł. Ma przynajmniej tyle samo sensu, co teraz działa (co przyznane, nie jest dużo). Myślę, że podstawowym problemem jest to, że klasy nie są jednostką kompilacji i łączenia, ale "jednostki tłumaczeniowe". Ale robiąc to klasy po klasie jest znacznie czystsze, mając klasy są moduły, jak w Java lub C# lub innych językach, które mają więcej sensu.

1

Miał ten sam problem, znalazł to pytanie. Zorientowałem się, że jeśli otoczysz struct foo anonimowym obszarem nazw, wydaje ci się, że możesz umieścić przestrzeń nazw zbyt wiele :: names;

u góry anonimowego opakowania. Jest jednak trochę brzydka, dodając kolejne warstwy zagnieżdżonych nawiasów klamrowych.

+0

Hmm ... ale w przestrzeni nagłówkowej masz anonową przestrzeń nazw. Nie jestem pewien, czy chcę otworzyć tę puszkę robaków: http://stackoverflow.com/questions/357404/anonynous-namespaces http://stackoverflow.com/questions/357564/uses-for-anonymous-namespaces-in-header- pliki – Dan

+0

Rozumiem, że projektowanie przestrzeni nazw było jednym z żalów z poprzedniej rundy normalizacyjnej, ponieważ było ono zapchane bez większego doświadczenia w implementacji. W większości korzystałem ostatnio z bibliotek nagłówkowych Boost, więc w pięciominutowym eksperymencie wydawało się to działać poprawnie. –

+0

http://www.drdobbs.com/184401782 –

Powiązane problemy