1

연결된 목록 유형 클래스에 대해 다음 샘플 코드를 고려하십시오. 반복자를 반환하는 메서드를 선언하고 싶습니다.이 메서드는 Node*에 대해 typedef입니다. 그러나 Node은 개인 중첩 클래스이므로 typdef을 만들기 위해 컴파일러에서 forward 선언을 사용하여 Node을 알게해야합니다.typedef 및 전달 선언에 대한 액세스 지정자의 역할

Naively, 나는 개인적으로 기본값으로 설정하는 것이 효과가 있다고 생각했습니다. 이 같은 : 라인 4에서 컴파일 타임 오류가 발생

class List 
{ 
    class Node; 
    typedef Node* Iterator; 
public: 
    List() : head_(NULL), tail_(NULL) {} 
    Iterator begin() {return head_;} 

private: 
    class Node 
    { 
     private: 
     int data_; 
    }; 

    Node* head_; 
    Node* tail_; 
}; 

int main() 
{ 
    List list; 
    List::Iterator = list.begin(); 
    return 0; 
} 

는 :

'형식 정의 클래스 목록 :: 노드 * 목록 :: 반복자는'로 인해 종료
컴파일은 비공개입니다 - 치명적 오류.

이 전방 선언 class Node;typedef Iterator Node*;에 대한 민간 부분에 속하지만 어떤 이유를 difficut하지? 이것은 아마도 typedef 키워드에 대한 이해가 부족하기 때문에 발생하지만, 어떤 액세스 지정자가 적용되는 것이 중요합니까? 나는 Node 클래스의 가시성 때문에 private이 더 의미가 있다고 생각했습니다.

공용 인터페이스의 일부인 typedef과 관련이 있습니까? 모든 typedef는 public 가시성으로 선언해야합니까?


편집 : 나는 대중에게 형식 정의를 이동하여 불평에서 내 컴파일러를 중지 할 수 날 명확히 허용을 이해합니다. 왜 이것이 필요한지 이해할 수 없습니다.

+3

클래스 정의 끝에 세미콜론을 추가하면 오류가 발생하지 않습니다. 이게 진짜 코드인가요? –

+0

아, 그래서 .. 그냥 단순화 된 버전입니다. – StickyCube

+0

@StickyCube 오류를 다시 생성 할 수 있는지 알 수 있습니다. 어쩌면 친구가 아닌 클래스/함수에서'Iterator' 유형을 사용하려고했을 것입니까? –

답변

1

간단히 typedef 이름을 공개 이름으로 만들 수 있습니다. 이름을 사용할 수 없도록

1

List::Iterator는 개인입니다 :). 두 클래스에 대한 당신이 닫는 중괄호 후 세미콜론을 배치하는 것을 잊었다 고려 또한 다음

class List 
{ 
public: 
    typedef class Node* Iterator; 

을 시도하지만, 타입 추론 할 수있다

List l; 
List::Iterator it = l.begin(); // Illegal 
auto it = l.begin(); // legal 

또는 BTW

template <typename IT> 
void foo(IT it); 

foo(l.begin()); // legal 

, List::Iterator 공개 일 수 있으며 List::Node 비공개로 유지해야합니다.