2009-09-05 8 views
4

나는이 일에 대한 나의 이론적 인 배경에 백지가 없다고 생각한다. 유사한 게시물이 있다는 것을 알고 있지만 여전히 이해가 가지 않습니다.레퍼런스에 lvalue 바인딩하기

somefunc2(Key); 

[BCC32 오류] Unit1.cpp (830) : E2357 참조 부호 짧은 '으로 초기화

void somefunc1(Word &Key) 
{ 
    somefunc2(Key); 
} 

void somefunc2(char &char1) 
{ 
    return; 
} 

컴파일러 나 여기에 에러가 발생하는 I 그러한 코드가

', 타입'char '의 lvalue가 필요함

나는 C++에 관한 ANSI 2003 규정 때문에 임시 변수를 다루고 있다는 것을 알아 냈다. ferences하지만 난 아직도 여기에 무엇이 잘못되지 않습니다. 나는 C 스타일의 변환을 수행 할 때

는 :

somefunc2(*(char*)&Key) 

는이 문제를 해결합니다.

누구나 저에게 어떤 암시가 있습니까? 왜 잘못 되었습니까?

+0

전체 C++ 코드를 입력하십시오. 당신이 제공 한 코드는 내가 취하는 함수를 선언하고 리턴 타입을 놓쳤습니다.완전한 C++ 코드 조각이 도움이 될 것입니다. –

+0

금요일 밤에 미안합니다. 나는 잠시 후에 고칠 것이다. – Andrew

+1

'Word' 란 무엇입니까? 그것은 정수형인가 객체인가? – strager

답변

4

임시가 아닌 참조에 바인딩 할 수 없습니다.

당신이 작성해야

:

void somefunc2(const char &char1) 
{ 
    return; 
} 
+2

대단한 반응! 명확하고 간결합니다. 그것은 내 지식의 위반을 이해하는 데 도움이되었습니다. 이제 매우 분명해 보입니다. – Andrew

+1

어디에서 (즉, 어떤 변수/참조) 여기에 임시입니까? – mlvljr

10
WORD &Key; 

참조는 항상 다른 개체에 대한 별명이며, 그것은 이미 존재하는 객체로 초기화해야합니다. 따라서 위의 선언은 유효하지 않습니다. 다음은 대신 올바른 :

WORD &Key = alreadyExistingKey; 

[위의 질문이 변경되었습니다, 더 이상 관련이 없습니다.]

편집 :

void somefunc1(Word &Key) 
{ 
    somefunc2(Key); 
} 
void somefunc2(char &char1) 
{ 
    return; 
} 

[BCC32 오류] Unit1.cpp (830) : E2357 '부호없는 단락'으로 초기화 된 참조는 'char'유형의 좌변가가 필요합니다.

T 그는 컴파일러에서 somefunc2이 [참조, 즉, 별칭]이 char이라고 예상하고 있습니다. 하지만 Keysomefunc1은 의 typedef로 인식되는 Word입니다. 당신의 "C 스타일"치료가 잔인 char의 주소와 같은 unsigned short의 주소입니다 &Key을 재 해석되어

이 날 것으로 보인다. 따라서 somefunc2에 전달하는 내용은 Key의 첫 번째 바이트이며 (부호가있는) char으로 해석됩니다. 나는 그 결과가 엔디안에 달려 있다고 생각한다. 나는 그 코드에 의존하지 않을 것이다.

+0

이 경우에 할 일이 무엇이겠습니까? 이것들은 변경할 수없는 (소스에 대한 액세스 권한이없는) 두 가지 기능이며 암시 적 변환과 같은 종류의 암시 적 변환입니다. reinterpret_cast는 아마도 내가 여기있는 똑같은 잔인한 접근 일 것입니다. – Andrew

+0

@Andrew : 소스에 액세스 할 수없고 함수가 컴파일러가 아닌 경우 정확히 무엇을 가지고 있습니까? '이 기능들'이 아니라면 게시 한 출처는 무엇입니까? –

+0

@Andrew :해야 할 일을 권유하려면 먼저 해당 기능에서 데이터가 어떻게 사용되는지 알아야합니다. 표준 데이터 크기를 가정하면 1 바이트 만 참조하는 함수에 전달하려는 데이터의 2 바이트에 대한 참조가 있습니다. 우리는 어떤 바이트가 전달되어야하는지 모른다. 또한 somefunc2가 참조 된 바이트를 수정하는지 여부는 알 수 없으며, 그렇다면 우리는 다른 바이트의 데이터에 어떤 일이 일어나는지 알지 못합니다. somefunc1을 실제로 쓰는 방법에는 여러 가지가 있습니다. – TheUndeadFish