2017-12-13 23 views
1

다음은 내 코드입니다. 열거 형 데이터 형식 변수를 인쇄하려고합니다. 그 중 하나는 이름과 다른 함수는 원래 변수와 동일한 데이터 형식을 반환합니다. ostream 및 enum 유형으로 오버로드 <<

#include <iostream> 

using namespace std; 
enum days{SUN, MON, TUE, WED, THU, FRI, SAT}; 


inline days dayaftertomorrow(days d) 
{ 
    return static_cast<days>((static_cast<int>(d) + 2) % 7); 
} 

ostream& operator<< (ostream& out, days& day) 
{ 
    switch(day) 
    { 
    case SUN: out << "SUN"; break; 
    case MON: out << "MON"; break; 
    case TUE: out << "TUE"; break; 
    case WED: out << "WED"; break; 
    case THU: out << "THU"; break; 
    case FRI: out << "FRI"; break; 
    case SAT: out << "SAT"; break; 
    } 
    return out; 
} 


int main(int argc, char const *argv[]) { 
    days d = MON, e; 
    e = dayaftertomorrow(d); 
    cout << d << "\t" << e << endl; 
    cout << d << "\t" << dayaftertomorrow(d) << endl; 
    return 0; 
} 

나는

MON  WED 
MON  WED 

같은 결과를 기대하지만 난이 문제를 해결 할 방법

MON  WED 
MON  3 

는 무엇입니까? operator<< 비 CONST 참조하여 파라미터 day 중임

+0

사용'열거 클래스 days' :'열거 class'의 사용은 필수 형식으로 암시 적 변환을 억제한다. 당신이 임시 객체와 일치하지 않는로 오버로드 된 연산자를 우회하는 대신 컴파일러의 오류가 발생하는 것이 방법은 (당신이 일을'const를 &를 취할 필요가 것'대신 일 및''의 매개 변수로 : 후자 만에 바인딩 [수정 가능] lvalue. –

답변

4

참고. dayaftertomorrow 값으로 돌아갑니다. 무엇 dayaftertomorrow 반환 non-const에 대한 참조를 바인딩 할 수없는 임시입니다. 그런 다음 cout << dayaftertomorrow(d)를 들어, operator<<가 호출되지 않습니다 열거 대신 std::basic_ostream::operator<<를 통해 인쇄 후 int과에 implicitly converted 될 것입니다; 그것이 3 인 이유입니다.

const을 참조하도록 매개 변수 유형을 변경할 수 있습니다. 임시에 구속력을 가질 수 있습니다. 또는 값으로 전달하도록 변경하십시오. 예 : 대신 열거 days``의

ostream& operator<< (ostream& out, const days& day) 
//         ~~~~~ 

ostream& operator<< (ostream& out, days day) 

LIVE