티스토리 뷰

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