반응형

C++ 컴파일 에러 : cannot bind ~

에러 메시지

cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&'


발생하는 사례

 보통 cout 표준 클래스에서 자주 발견된다. 뿐만 아니라 연산자 오버라이딩이 된 클래스를 사용하다 보면 종종 발생된다.


에시1

// c++11 more than
#include <iostream>

using namespace std;

enum class COLOR
{RED, GREEN, BLUE};

int main(const int argc, const char * argv[])
{
    cout << "Color enum Red : "
        << static_cast<int>(COLOR::RED) << endl;    // No Error
    cout << "Color enum Green : " << COLOR::GREEN << endl;    // Error!
    return 0;
}




예시2

 이 예시는 보기 조금 민망하다..

// c++11 more than
#include <iostream>
#include <vector>

using namespace std;

int main(const int argc, const char * argv[])
{
    cout << "vectors : " << vector<int>{1, 2, 3} << endl;    // Error!
    return 0;
}




원인

 입출력 관련 클래스가 연산자 오버라이딩이 가능해지면서 직관적으로 코드를 작성할 수 있게 되었는데, 그러다 보니 정의 되지 않은 타입을 연산자로 받을 경우 발생되는 간단한 에러이다. 별거 아닌 에러이지만, 사람이 종종 실수를 할 수 있기 때문에 볼 수 있다. 다만, 메시지의 의미를 파악하는 연습을 하도록 하자.

 해결 방법은 연산자가 이해할 수 있는 타입으로 캐스팅을 해주거나 연산자 오버라이드를 추가 해주면 된다. 이 글을 작성하는 시점에서는 이런 실수를 방지 하기 위해 연산자 오버라이딩은 가능하면 자제하는 추세인걸로 알고 있다.


참고자료

스택오버플러워 질문



반응형

'C++' 카테고리의 다른 글

C++11 : 범위기반 for 문  (0) 2018.03.04
C++11 : STL std::array 정적배열  (0) 2018.03.04
C++ Socket : 고정 구조체  (0) 2017.08.04
C++11 : 연역적 선언 auto (입문)  (0) 2017.07.03
C++ 패턴 : 동적 싱글턴(Dynamic Singleton)  (0) 2017.06.16

+ Recent posts