2017-03-17 1 views
-1

안녕하세요, 저는 최근에 C++을 더 잘 이해하기 시작했고 다른 문제를 발견했으며 대부분이 명확 해지기 시작했습니다. 내가 이해하지 못했던 한 가지는 컴파일러가 ostream 또는 클래스 선언의 모든 스트림을 선언하려고 할 때 발견 한 오류입니다. 예 :ostream Understading 및 클래스 정의 선언 방법

class Test{ 
    stringbuff buff; 
    ostream out (&buff) 

; 내가 함께 할 때

expected identifier before ‘&’ token 

Oneother은 다음과 같습니다 :

stringstream stream(std::in|std::out); 

컴파일러

error: ‘std::ios<char, std::char_traits<char> >::in’ is not a type 
    stringstream out(ios::in|ios::out); 

를 반환 문제는 왜이 할 수없는 것입니다 }

컴파일러는이 오류 메시지를 반환 나는 클래스 선언에서이 '함수'를 호출하고 메소드의 왕은 무엇이라고 부릅니다. 예를 들어, ostream o (메소드)와 같은 방식으로 동일한 메쏘 드를 어떻게 선언 할 수 있는지 더 명확하게하기 위해;

내 영어로 인해 유감스럽게 생각합니다.

+0

'ostream out {& buff};'오류를 수정합니다. 나는 너무 피곤하다. 누군가가 이유와 다른 해결책을 설명하는 답을 쓸 수 있기를 바랍니다. – DeiDei

+0

세미콜론으로 완성 된 실제 코드를 게시하여 문제를 일으 킵니다. –

답변

0

문제는 해당 진술 ostream out (&buff) ;은 데이터 멤버가 아닌 함수 멤버를 선언하려는 시도로 컴파일러에서 처리됩니다. 이는 Most vexing parse의 일반화 된 사례입니다.

"C++ 11에 도입 된 새로운 유니폼 초기화 구문을 사용하면이 문제를 해결할 수 있습니다."또한 클래스 초기화를 위해서 : ostream out{ &buff };.

는 데이터 멤버에 대한 "직접 초기화"용도의에서 ()를 ++ (11)는 단지 당신이 {} 또는 복사 초기화 =와 함께 직접 초기화을 사용할 수 있습니다 ℃,보다 구체적으로, 그리고하려면 클래스 내 초기화.

또 다른 옵션은 생성자의 init 목록 내에서 데이터 멤버를 초기화하는 것입니다.

class Test 
{ 
    std::stringbuf buff ; 
    std::ostream out ; 
    public : 
    Test() : out(& buff) { } 
} ;