2013-11-25 3 views
-2

여기에 약간의 문제가있어서 처리 할 수 ​​없습니다. 그래서 저는 제 수업을 선생님이라고 선언했습니다 :"<<"연산자가 오버로드되는 동안 내 클래스에서 선언 된 멤버에 액세스 할 수없는 이유는 무엇입니까?

typedef unsigned int Uint; 
typedef vector<Uint> TVint; 
typedef vector<Uint>::const_iterator TIterator; 

class Sir 
{ 
protected: 
    Uint _count; 
    TVint _elements; 
public: 
    ... 
    friend std::ostream& operator << (std::ostream &out, const Sir &sir) 
     { 
      for(size_t i = 0; i < sir._count; i++) 
      { 
       out<<"[" << i << "]" << " " << sir._elemente[i]<<endl;    
      } 
     } 
}; 

클래스에 선언 된 보호 된 멤버에 액세스 할 수 없다고 말합니다. 나는 무엇이 없는가 ??

+4

'sir._elemente' 보이는,하지만 당신은 아무것도 누락하지 않는 다른 물건으로, 코드는 괜찮 : 당신은 그 방법에서 뭔가를 반환해야합니다. – jrok

+0

'friend' 키워드가 있기 때문에 멤버가 아닌 친구로 만들고 싶지만 인라인으로 정의하면 멤버 함수로 실제로 구현됩니다 (즉,'friend' 키워드는 필요 없습니다). 컴파일러에서 제공하는 _exact_ 오류 메시지는 무엇입니까? – Chad

+3

@Chad :'friend' 키워드는 정확하게 비회원 기능을 만드는 것입니다. –

답변

0

오타가있는 경우 _elemente 대신 <<이 오버로드 된 경우 _elements을 사용해야합니다. 그것은`sir.elements`해야처럼

friend std::ostream& operator << (std::ostream &out, const Sir &sir) 
{ 
    for(size_t i = 0; i < sir._count; i++) 
    { 
     out<<"[" << i << "]" << " " << sir._elements[i] <<endl; 
             //^^^^^^^^^^^^^^^^ 
    } 
    return out; 
    //^^^^^^^^^^^ 
} 

Live code

관련 문제