2009-09-05 90 views
4

我覺得我在這個東西的理論背景中錯過了思考。我知道有類似的帖子,但我仍然沒有得到它。將參考文獻的左值設爲

我有這樣的代碼:

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

void somefunc2(char &char1) 
{ 
    return; 
} 

編譯器生成我一個錯誤這裏:

somefunc2(Key); 

[BCC32錯誤] Unit1.cpp(830):E2357參考與「無符號短初始化',需要類型爲'char'的左值

我發現這是因爲ANSI C++處理臨時對象的規則和2003但我仍然沒有得到這裏的錯誤。

當我做C語言風格轉換:

somefunc2(*(char*)&Key) 

它解決的問題。

任何人都可以提示我什麼是錯的,爲什麼錯了?

+0

請提供完整的C++代碼。你提供的代碼應該聲明一個函數,但錯過了返回類型。一個完整的,應該工作的C++代碼片段將會幫助你更好,我想 – 2009-09-05 03:10:16

+0

對不起,它是星期五晚上。我會在第二時間解決。 – Andrew 2009-09-05 03:14:10

+1

什麼是'Word'?它是整數類型還是對象? – strager 2009-09-05 04:13:16

回答

4

臨時不能綁定到非常量引用。

你應該這樣寫:

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

偉大的迴應!清晰簡潔。 它有助於理解我所知道的違規行爲。 現在看來非常明顯。 – Andrew 2009-09-08 13:28:54

+1

哪裏(即哪個變量/參考)在這裏是暫時的? – mlvljr 2010-03-10 18:37:18

10
WORD &Key; 

的參考文獻是總是對其他對象的別名,並且它必須與已經存在的對象進行初始化。因此,上述聲明無效。下面是不是正確的:

WORD &Key = alreadyExistingKey; 

[以上是不再相關,這個問題已經改變了。]

編輯:

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

[BCC32錯誤] Unit1.cpp (830):E2357用'unsigned short'初始化參考,需要'char'類型的左值

T他編譯器告訴你somefunc2正在等待[參考,也就是char的別名]。但Keysomefunc1而不是Word,我的理解是unsigned short的typedef。

在我看來,你的「c式」補救措施是殘酷地重新解釋&Key,這是unsigned short的地址,作爲char的地址。因此,您傳遞給somefunc2的內容是Key的第一個字節,解釋爲(帶符號)char。我想結果取決於字節順序。我不會依賴那個代碼。

+0

你能否也提示在這種情況下做什麼是件好事?這些只是我無法改變的兩個功能(不能訪問源代碼),這種隱式轉換我不是一個很大的粉絲,但必須處理。 reinterpret_cast最有可能在這裏是我猜想的同樣殘酷的方法? – Andrew 2009-09-05 03:55:45

+0

@Andrew:如果您無法訪問源代碼並且函數不能編譯在一起,您究竟擁有什麼?如果不是「這些功能」,您發佈的來源是什麼? – 2009-09-05 08:36:33

+0

@Andrew:爲了推薦你應該做什麼,我們首先需要知道這些函數如何使用數據。假設標準數據大小,您可以參考2個字節的數據,您試圖將其傳遞到僅引用1個字節的函數中。我們不知道應該傳遞哪個字節。此外,我們不知道somefunc2是否修改了引用的字節,如果是,那麼我們不知道其他字節的數據會發生什麼。 根據實際的用途,可以採用多種方法來編寫somefunc1。 – TheUndeadFish 2009-09-06 00:44:20