2010-01-25 5 views
15

using 선언을 헤더 파일에 넣을 때 발생할 수있는 문제를 이해합니다. 그러지 않으려 고합니다. 대신 클래스 파일 내에 using (또는 namespace foo =)을 넣어 헤더 파일에서 반복적 인 입력을 줄이려고했습니다. 불행히도 컴파일러 오류가 발생합니다. 그것은 유용한 기능이 될 것 같습니다.왜 "using"선언을 클래스 선언 안에 넣을 수 없습니까?

#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 

실제 코드에서 네임 스페이스 이름은 훨씬 길고 성가 시며 변경할 수있는 것이 아닙니다.

누구나 이것이 합법적이지 않은 이유를 설명하거나 해결 방법이있는 경우 (더 나은) 설명 할 수 있습니까?

답변

21

typedef gee::whiz::abc::def::Hello Hello 할 수 있습니까?

+2

이것은 여전히 ​​피하려고 시도하는 네임 스페이스를 오염시킵니다. – Trent

+6

클래스 선언 내에서 사용되는 경우 아닙니다. –

+0

예, 작동합니다! 그리고 그것을 개인용 typedef로 만들면 다른 코드가 우연히 그것을 사용할 수 없습니다. – Dan

4

실제로 완전히 무시 무시한 아이디어는 아닙니다. 적어도 그것이 현재 어떻게 작동하는지만큼이나 감각을 발휘합니다 (별로 좋지는 않습니다). 기본 문제는 클래스가 컴파일 및 링크의 단위가 아니라 '번역 단위'라는 점입니다. 하지만 클래스별로 클래스를 수행하는 것은 Java 또는 C# 또는 더 합리적인 다른 언어와 같이 클래스가 모듈 인 훨씬 깨끗합니다.

1

같은 문제가 발생했을 때이 질문을 발견했습니다. 구조체 foo를 익명의 네임 스페이스로 감싸는 경우 알아낼 수있는 것처럼 보입니다.

네임 스페이스를 너무 많이 사용하여 :: many :: names;

익명의 래퍼 상단에 있습니다. 그러나 중첩 된 중괄호의 레이어를 추가하는 것은보기 흉한 일입니다.

+0

흠 ...하지만 헤더 파일에 anon 네임 스페이스가있다. 그 벌레의 수있는 열 수 있는지 확실하지 : http://stackoverflow.com/questions/357404/anonynous-namespaces http://stackoverflow.com/questions/357564/uses-for-anonymous-namespaces-in-header- 파일 – Dan

+0

많은 구현 경험없이 벼락치기 때문에 네임 스페이스의 디자인이 이전 표준화 라운드에서 후회 중 하나라는 것을 알고 있습니다. 나는 대부분 Boost 헤더 라이브러리를 최근에 사용 해왔다. 그래서 이것은 5 분의 실험에서 OK로 작동하는 것처럼 보였다. –

+0

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

관련 문제