2013-12-07 4 views
0

헤더 파일의 클래스 정의를 깨끗하게 유지하기 위해 템플릿 기반 함수의 구현을 기본 헤더에 포함 된 *.h 파일로 옮기기로 결정했습니다. 이제 코드를 더 읽기 쉽게 만들기 위해 using namespace을 사용하고 싶습니다.템플릿 구현 파일 내의 네임 스페이스 사용

그러나 네임 스페이스를 사용하면 파일이 전체 응용 프로그램에 포함되는 헤더에 포함되므로 응용 프로그램 전체에 영향을 미칩니다. 네임 스페이스의 using은 파일에서 분산됩니다.

어떻게 처리 할 수 ​​있습니까?

+3

'네임 스페이스 XX 사용하기 '는'using namespace'를 둘러싸는 범위까지만 확장됩니다. 예를 들어 메소드 정의 안에'using namespace'를 사용하면 "유출되지"않습니다. 불행히도, 당신은'class' 레벨에서 이것을 사용할 수 없습니다. (즉'class foo {네임 스페이스 std를 사용 ...}} –

+0

은 네임 스페이스에 정의 된 클래스입니까? – elyashiv

+0

@JoeZ 캡슐화 된 범위를 만들기 위해 템플릿 파일의 모든 것을'{''}'로 감쌀 수 있습니까? – danijar

답변

2

당신은 함수 정의 내에서 using namespace XX를 넣을 수 있습니다 해당 함수에 대한 사용 선언의 범위를 지정합니다.

int func(...args...) 
{ 
    using namespace std; 
    // ... body of function 
} 
1

네임 스페이스 별칭을 사용하십시오.

namespace submod_ = topspace::other_project::module::submodule; 

매우 긴 네임 스페이스가 필요한 곳이면 submod_을 사용할 수 있습니다.

이렇게하려면 긴 네임 스페이스 한정자를 사용하는 경우에도 여전히 submod_을 사용해야합니다. 그런 의미에서, 그것은 당신의 질문에 정확하게 대답하지 않습니다. 그러나 나는 자격의 설명이 가독성을 돕고 실수를 예방하는 데 도움이된다고 주장 할 것이다.

코드 작성자가 몰랐던 "사용 중"선언이 "숨어있는"함수로 가져온 StackOverflow 질문의 실제 예가 있습니다.

+0

내 주요 관심사는 네임 스페이스를 사용하여 내 머리글을 포함하는 다른 파일로 확산된다는 것입니다. 그것은 별칭과 같을 것입니다. – danijar

+0

나는 알고있다. 나는 네임 스페이스 별칭이 덜 위험하다고 생각합니다. 'using' 지시어를 사용하면 클라이언트 코드의 조회 세트 (즉, 헤더가 포함 된 코드)에 자동으로 함수와 유형이 추가됩니다. 네임 스페이스 별칭을 사용하면 클라이언트 코드는 유형 또는 함수에'submod_ :: '별칭 (이 경우)을 접두사로 사용해야합니다. – NicholasM

0

당신은 당신의 주요 헤더 '의 namespaceusing namespace을 배치 할 수 있습니다 :

header.h가

#include <string> 

namespace Test 
{ 
    using namespace std; 

    string f() 
    { 
     return "Test"; 
    }; 
} 

MAIN.CPP

#include "Header.h" 

int main() 
{ 
    Test::f(); 

    string test;  // Error: identifier "string" is undefined 
    std::string test; 

    return 0; 
} 
+0

그래,하지만 템플릿 구현에 대해 이야기하고 있는데, 내가 아는 한 헤더 끝 부분에 포함시켜야합니다. – danijar

+0

@danijar이 예제는 모든 종류의 구현에 적용됩니다. 그래서 템플릿 화 된 함수 헤더의'네임 스페이스'안에'using namespace'를 둘 수 있습니다. –

+0

흠, 현재 네임 스페이스에 살고 있지 않습니다. 나는 그것을 바꾸는 것을 생각할 것이다. – danijar

관련 문제