반응형
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 |