2012-03-24 3 views
2

가능한 중복 :
Scoped using-directive within a struct/class declaration?
Why “using namespace X;” is not allowed inside class/struct level?왜 C++ 구조체에서 네임 스페이스 지시문을 사용할 수 없습니까?

나는 구조로 단지 표준 : : 문자열을 소개하고 싶습니다. 아래의 내용이 불법으로 간주되는 이유는 무엇입니까? C++는 다른 의미를 가진 동일한 키워드를 사용

#include <iostream> 
#include <string> 

struct Father 
{ 
    using std::string; 

    string sons[20]; 
    string daughters[20]; 
}; 

그러나 이상하게도, 나는

int main() 
{ 
    using std::string; 
} 

기능에 따라 업데이트를 할 수 있습니다.

C++는 "using"키워드를 사용하여 기본 클래스의 데이터 멤버 또는 함수를 현재 클래스에 도입합니다. 따라서 구조체 선언 안에 std :: string을 사용하여 썼을 때 컴파일러는 기본 클래스 std에서 멤버를 소개하려고한다고 가정합니다. 하지만 std는 기본 클래스가 아니라 네임 스페이스입니다. 따라서

struct A 
{ 
    int i; 
} 

struct B:A 
{ 
    using A::i; // legal 
    using std::string// illegal, because ::std is not a class 
} 

동일한 "사용"키워드

는 특정 공간의 부재에 접근하기 위해 사용된다.

그래서 저는 컴파일러가 선언 된 위치에 따라 "using"의 의미를 결정한다고 추측합니다.

+2

질문을 편집 할 때 ** 자동으로 삽입 된 "중복 될 수 있음"링크를 ** 제거하지 마십시오 **. 제안 된 질문과 중복되지 않는다고 생각하는 이유를 설명하기 위해 업데이트 한 것으로 이해합니다. 이는 완벽하게 수용 가능한/권장되는 행동입니다. 그러나 편집 한 내용을 질문에 부쳐 목록에있는 사용자가 다시 투표에 참여 시키거나 "깃발"링크를 사용하여 운영자가 업데이트 당 검토하고 다시 열도록 요청해야합니다. 자동 삽입 된 링크를 제거하는 것은 매우 바람직하지 않습니다. 다시 열면 시스템에서이를 제거합니다. –

+0

(이 경우 실수로 삭제 한 경우, 즉 수정 사항이 제 시간에 충돌 한 경우 가혹한 음색에 사과드립니다. 미래에 대한 조언으로 받아들이세요. :-)) –

답변

2

나는 실제 질문에 대한 답을 모르는,하지만 당신은 타입 정의 사용할 수 있습니다 : 그것은 단지 불행하게도 언어에 의해 허용하지 않는다

struct Father 
{ 
    typedef std::string string; 

    string sons[20]; 
    string daughters[20]; 
}; 
0

을하지만, 해결 방법있다 :

namespace Father_Local 
{ 
    using std::string; 

    struct Father 
    { 
     //... 
    }; 
} 

using Father_Local::Father; 

이 방법의 장점은 원칙적으로 using 지시문을 작성할 수 있다는 것입니다.

using namespace boost::multi_index; 

거기에 타이핑과 혼잡의 부하를 덜어줍니다. 이것의 나머지는 코드의 나머지 부분에 영향을 미치지 않습니다. - 아버지는 끝에 사용하여 적절한 네임 스페이스로 가져오고 모든 것이 잘 작동합니다.

관련 문제