2009-07-30 6 views
3
namespace A 
{ 
    #include <iostream> 
}; 

int main(){ 
A::std::cout << "\nSample"; 
return 0; 
} 
+2

컴파일러가 없습니까? –

+2

왜 그렇게하고 싶습니까? – AraK

답변

8

짧은 답변 : 제

긴 대답 : 음, 정말. 당신은 그것을 가짜로 만들 수 있습니다. 당신은 외부를 선언하고 다음과 같이 네임 스페이스 내에서 문을 사용하여 사용할 수 있습니다 : 그것은에 액세스 한 경우에도, 그것은 표준 네임 스페이스에 액세스 할 수 없습니다 때문에

#include <iostream> 

namespace A 
{ 
    using std::cout; 
}; 

int main(){ 
A::cout << "\nSample"; 
system("PAUSE"); 
return 0; 
} 

당신은, 라이브러리를 지역화 할 수 없습니다.

또한 "다른 문제는 네임 스페이스 내부의 정규화 된 이름이 A :: std :: cout이지만 라이브러리에는 외부 네임 스페이스로 정규화 된 이름이 포함되지 않는다는 것입니다." Jonathon Leffler에게 감사드립니다.

문제는 다른 사람들이 모든 코드에서 무엇을 할 수 있는지 알려주지 않으려는 경우 iostream을 포함시킬 자체 cpp 파일을 가질 수 있고 거기에 정의 된 네임 스페이스를 가질 수 있습니다. 그런 다음 주 (또는 무엇이든)에 포함시키고 프로그래머가 할 수있는 일과 할 수없는 일을 알리십시오.

+2

다른 문제는 네임 스페이스 내부의 정규화 된 이름이 A :: std :: cout이지만 라이브러리가 외부 네임 스페이스로 정규화 된 이름을 포함하지 않는다는 것입니다. –

+1

아주 좋은 지적입니다. 추가됨. +1 – jkeys

5

당신은 쓸 수 :

#include <vector> // for additional sample 
#include <iostream> 
namespace A 
{ 
    namespace std = std; // that's ok according to Standard C++ 7.3.2/3 
}; 

// the following code works 
int main(){ 
A::std::cout << "\nSample"; // works fine !!! 
A::std::vector<int> ints; 
sort(ints.begin(), ints.end()); // works also because of Koenig lookup 

std::cout << "\nSample"; // but this one works also 
return 0; 
}

Thit 접근이 별명 네임 스페이스라고합니다. 이 기능의 실제 목적은 다음 샘플에서 나타납니다.

namespace Company_with_very_long_name { /* ... */ } 
namespace CWVLN = Company_with_very_long_name; 

// another sample from real life 
namespace fs = boost::filesystem; 
void f() 
{ 
    fs::create_directory("foobar"); // use alias for long namespace name 
}