2010-02-05 3 views
1

나는 네임 스페이스를 사용하는 코드를 가지고 있으며 그 중 일부는 내 두뇌에 혼란을 일으키고 있습니다.NameSpaces 언제, 어디서, 왜!

내가 좋아하는 뭔가가있는 경우 :

#include <vector> 

protected: 
    std::vector<registeredObject> mRegistryList; 

또는 내가 필요합니까 :

#include <vector> 

protected: 
    vector<registeredObject> mRegistryList; 

을 컴파일러는 벡터 '어떤 유형의'난 그냥이 작업을 수행 할 수 없습니다

이 없습니다 불평 해야 할 일 :

여러 네임 스페이스 등을 사용하는 적절한 방법은 무엇입니까?

+0

관련 항목 : http://stackoverflow.com/questions/1452721/ –

답변

1

둘 중 두 가지 가능성 중 하나가 작동합니다. 경우에 당신은 세 번째도있다 상관 : 이들 중

using std::vector; 

protected: 
    vector<registeredObject> mRegistryList; 

using namespace std;는 일반적으로에 좋습니다 - 당신이 기본적으로도에 대해 알 수 없다 일부 이름의 큰 숫자에 드래그, 그래서 그것은 당신 자신의 코드로 모든 종류의 것들과 충돌하는 것이 쉽습니다. 대부분의 사람들은 다음과 같이 명시 적으로 정규화 된 이름을 사용합니다. 대부분 std::vector... 버전입니다.

3

위의 코드가 클래스 내에 있다고 가정합니다. 이 경우 # 2가 필요합니다. 실제로 은 헤더 내에 # 3을 피하는 것이 좋습니다. 물론 클래스 정의가 상주합니다. 그렇지 않으면, #include 헤더 파일, 당신은 매우 결과 네임 스페이스 충돌로 화가 될거야.

1

컴파일러는 벡터 '어떤 유형의'글로벌 네임 스페이스에 vector라는 더 클래스가 없기 때문이다

이 없다고 불평. 그리고 벡터 컴파일러를 정의하는 동안 네임 스페이스를 지정하지 않았으므로 클래스를 찾을 수 없습니다.

두 번째 옵션은 정상입니다. 컴파일러에게 vecror 클래스가 std 네임 스페이스에 있다고 알려줍니다.

세 번째 옵션 std::의 경우 mRegistryList의 정의에 이미 using std; 문으로 네임 스페이스를 포함 했으므로 불필요합니다. 나는 using 문장이 네임 스페이스를 오염시킨다 (특히 헤더 파일에서 사용될 때). 그래서 나는 두 번째 옵션을 선호한다.

1

먼저, using namespace을 헤더 파일에 넣지 마십시오. 그렇지 않으면이 파일을 포함하는 모든 파일은 전역 이름 공간에 가져온 지정된 네임 스페이스의 모든 유형을 갖게됩니다. 이것은 많은 혼란을 일으킬 것입니다.

둘째로, 마지막 예제에서 #include 앞에 모두 포함 된 using namespace을 작성했습니다.

세 번째로, using namespace std;이라고 쓰면 std::vector을 완전히 인증 할 필요가 없으며 vector을 사용할 수 있습니다.헤더 파일에서

  1. , 항상 정규화 된 네임 스페이스를 사용

    마지막으로, 내 취향은 다음과 같다.

  2. 원본 파일에서 std 네임 스페이스에서 하나 또는 두 가지 유형 만 사용하는 경우 전체 네임 스페이스 대신 using std::vector;을 사용할 수 있습니다.
  3. std 네임 스페이스에서 많은 유형을 사용하는 소스 파일에서 using namespace std;으로 이동하십시오.
0

선언을 사용하거나 명시 적으로 네임 스페이스를 지정하면 사용할 수있게됩니다. 내가 겪고 있다고 생각하는 문제는 "보호 된"선언입니다. "protected"와 같은 액세스 지정자는 클래스의 컨텍스트에서만 사용됩니다.

"std"네임 스페이스에서 모든 것을 필요로하지 않으므로 전역 "사용"선언을 사용하는 것이 일반적으로 좋지 않으므로 사용하는 것이 가장 바람직합니다. 이름 충돌의 가능성을 줄이는 별도의 네임 스페이스. 때로는 "std :: vector;"와 같이 네임 스페이스에서 사용할 객체에 대한 선언을 사용하여 좋은 중간지면을 단일 객체로 만들 수 있습니다. 모든 표준 객체에서 드래그되지는 않을 것입니다. 그러나이 경우에도 코드에서 다른 것이 "벡터"라고 불리면 충돌이 발생할 수 있습니다. 일반적으로 명시 적 사양을 사용하는 것이 가장 좋습니다.

1

지시문을 사용하면 양식이 using namespace some_name;이고 지침 범위는 기능 범위 밖에서 사용해서는 안됩니다. 함수 범위에서 그것들을 사용하면 (심지어 그 함수가 인라인이나 템플릿 같은 헤더에 정의되어있을 때조차도) 항상 괜찮습니다.

선언을 사용하면 양식이 using something::something;이고 지침은 헤더의 전역 범위에서 사용해서는 안됩니다. 네임 스페이스, 클래스 정의 또는 함수 범위에서이 메서드를 사용하면 항상 문제가 없습니다.

이 지침을 따르면 뜻하지 않은 이름 모호성 문제가 발생하지 않으며 포함될 때 다른 코드를 손상시키는 헤더를 작성하지 않습니다.

관련 문제