C++
C++ 컴파일 에러 : cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&'
밤이없는자
2018. 1. 5. 11:23
반응형
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;
}
원인
입출력 관련 클래스가 연산자 오버라이딩이 가능해지면서 직관적으로 코드를 작성할 수 있게 되었는데, 그러다 보니 정의 되지 않은 타입을 연산자로 받을 경우 발생되는 간단한 에러이다. 별거 아닌 에러이지만, 사람이 종종 실수를 할 수 있기 때문에 볼 수 있다. 다만, 메시지의 의미를 파악하는 연습을 하도록 하자.
해결 방법은 연산자가 이해할 수 있는 타입으로 캐스팅을 해주거나 연산자 오버라이드를 추가 해주면 된다. 이 글을 작성하는 시점에서는 이런 실수를 방지 하기 위해 연산자 오버라이딩은 가능하면 자제하는 추세인걸로 알고 있다.