2017-02-09 11 views
6

왜 이것이 실패하는지 이해할 수 없습니까?cout에 unique_ptr을 인쇄하십시오.

int *p = new int(10); 
std::unique_ptr<int> ptr(p); 
// Below line gives compilation error. 
std::cout << "Value of ptr  " << ptr << std::endl; 
// Below line works well. 
std::cout << "Value pointed ptr " << *ptr << std::endl; 
std::cout << "Value of ptr->get() " << ptr.get() << std::endl; 

내가 그것을 이런 식으로 이해 :

이 페이지의 주소가 100, 새로운 할당 된 메모리의 주소가 위의 묘사에서 200

p    new allocated memory 
----------  --------- 
    200    10 
----------  --------- 
100    200 


ptr 
---------- 
    200 
---------- 
300 

이다 말을, unique_ptr은 새로 할당 된 메모리를 가리키는입니다 그 자체로 '피'를 피합니다. 그래서, 'ptr'인쇄는 200을주지 않아야합니까?

답변

2

그래서 'ptr'을 인쇄해도 200이되지 않아야합니까?

표준 라이브러리 std::unique_ptr을 표준 스트림으로 스트리밍 할 수 있어야합니다. 즉, std::unique_ptr에 대한 operator <<의 오버로드가 존재해야합니다.

그러나 표준에서는 그러한 사항을 지정하지 않으므로 unique_ptr을 스트리밍하면 컴파일 오류가 발생합니다 (아니 operator << 수락). 당신이 발견으로이 솔루션은 다음과 같습니다

stream << ptr.get() 
+0

오오. 이해해. C++ 커뮤니티가 <<을 (를) 오버로드하는 것을 막고있는 것을 구입하십시오? –

+1

@HemantBhargava :별로 필요 없습니다. C++ 표준은 이미 너무 커서 (*), 거의 아무도 사용하지 않을 물건을 추가하면 더 커집니다. * : 아니요, 제거 할 항목에 대한 좋은 제안이 없습니다. –

+2

@MartinBonner thinning 제안에 대해서는'std :: vector '이 떠오른다. – Angew

9
std::unique_ptr<int> ptr(p); 
// Below line gives compilation error. 
std::cout << "Value of ptr  " << ptr << std::endl; 

일부의 객체를 인쇄하는 일반적인 << 구문을 사용하는 것이 가능하게하려면 다음 포인터를 스트리밍해야하는 경우, 포인터를 얻을 클래스 cout을 사용하는 경우 operator<<의 적절한 과부하가 구현되어야합니다. C++ 표준 라이브러리 디자이너가 선택한

#include <ostream> // for std::ostream 

std::ostream& operator<<(std::ostream& os, const X& x) 
{ 
    // Implement your output logic for 'x' 
    ... 

    return os; 
} 

가 이러한 과부하를 구현하지 : 당신은 클래스 X가 있다면 당신은 cout << x 구문을 사용하려는 경우

예를 들어,이 같은 operator<<를 오버로드 할 수 있습니다 std::unique_ptr; 따라서 unique_ptr 초의 인스턴스를 사용하여 <<을 사용하려고하면 컴파일 오류가 발생합니다.