티스토리 뷰
728x90
프로그램 빌드 과정에서 가끔 한 번씩 만나면서도 자꾸 까먹는 실수로 인한 컴파일 에러 메시지이다. 직역을 하자면 비상수형 lvalue 참조를 할 수 없다는 것이다. 일단, lvalue는 "A=B"라는 문장이 있다면 대입연산자(=) 좌측에 있는 것을 말하고, 우측에 있는 것을 rvalue라고 한다.
void dlgPou::SetPouNames(vector <string> &pou_names)
{
PouNames.clear();
for (int ip = pou_names.size() - 1; ip >= 0 ; ip ++) {
string str = "";
std::transform(pou_names[ip].begin(), pou_names[ip].end(), str.begin(), ::toupper);
PouNames.push_back(str);
}
}
//......
dlg.SetPouNames(CTR->GetProjectPouNames());
에러가 발생한 코드를 보면 SetPouNames라는 함수는 스트링 벡터를 참조에 의한 호출(Call by Reference)로 인수를 받고 있고 호출한 곳에서도 스트링 벡터를 리턴하는 다른 함수 결과를 전달했으므로 문제가 없어 보이지만 "error: cannot bind non-const lvalue reference of type"라는 에러를 떨군다.
해결책은 간단하다. 위의 예제 코드를 보면 헤더파일에 정의한 함수들이 대부분 참조에 의한 호출(Call by Reference)로 인수를 받고 있는데 그 앞에 "const"를 붙이고 있다는 점이다. 함수 인수에 const를 명시하면 함수 내에서 해당하는 값을 참조만 하고 변경하지 않겠다는 의미이므로 이런 용도라면 const를 붙여서 해결하면 된다.
728x90
'C | C++' 카테고리의 다른 글
QComboBox 클래스(QT C++) (0) | 2024.02.11 |
---|---|
QMessageBox 클래스(QT C++) (0) | 2024.02.09 |
C/C++ 스트링 대소문자 바꾸기, std::transform, toupper, tolower 사용 (0) | 2024.02.02 |
서로 다른 값 두 개를 리턴하기(std::pair) (0) | 2024.01.25 |
스트링 클래스(string, std::basic_string) 정리 (0) | 2024.01.24 |