[英]No conversion from long unsigned int to long unsigned int&
我收到錯誤消息沒有已知的轉換參數2從long unsigned int
到long unsigned int&
當我嘗試編譯以下代碼時:
void build(int* &array, unsigned long& index) {
if (index == 0)
return;
else {
heapify(array, index);
build(array, index-1);
}
}
有人可以解釋為什么會發生這種情況,這個錯誤背后的邏輯是什么?
build
的第二個參數需要引用(用&
標記)。 引用有點像指針,因此您只能使用具有內存地址的實際變量。
這就是為什么你不能使用像index-1
這樣的表達式。
非const引用只能綁定到C ++中的左值。 index-1
返回一個臨時的,如果綁定到引用將立即超出范圍,你將有一個懸空引用。 雖然const引用可以綁定到臨時引用,但它會將臨時引用的生命周期延長到const引用的生命周期。 所以,如果你可以改變unsigned long&
const unsigned long&
那么它應該可行。
build
的第二個參數是對unsigned long
的引用。 但是在遞歸調用中,你傳遞一個實際值(即“rvalue”)。
如果您按如下方式重寫函數,問題應該消失。
void build(int* &array, unsigned long& index) {
if (index == 0)
return;
else {
heapify(array,index);
index -= 1;
build(array,index);
}
}
但請注意,這可能不是您想要的。 index
的值將在遞歸調用之前更改。 您可能希望在調用后將其更改回來( index += 1
),具體取決於函數的總體用途。
請參閱C ++的設計和演變 ,第3.7章,第86頁,它給出了這個例子:
void incr(int& rr) { rr++; }
void g()
{
double ss = 1;
incr(ss) // note: double passed, int expected
// (fixed: error in Release 2.0)
}
在C ++的第一個版本中,從double
創建了一個臨時類型為int
值,值為1
,然后將臨時值傳遞給incr
並且未修改ss
。 為了防止這種意外行為,語言被更改,以便臨時(即未命名的變量)不能綁定到非const引用,因為非const引用參數通常意味着將修改參數以將信息傳遞回呼叫者。 如果靜默創建臨時,則呼叫者丟失該信息,例如
void* get_ptr(int& error); // sets error=0 if returned pointer is valid
void g()
{
unsigned err = 0; // oops, wrong type
void* p = get_ptr(err); // uh-oh, error status stored in temporary
if (err == 0) // condition always true
use_ptr(p); // uh-oh! pointer may not be valid!
}
如果允許非const引用綁定到臨時,則此程序是危險的,因為get_ptr(err)
將創建臨時int
,如get_ptr(int(err))
,並在臨時中設置錯誤狀態,因此err
即使出現問題,仍然會為零。
如果函數作者希望能夠接受臨時值,因為該參數不會用於將信息傳遞回調用者,那么該函數可以按值獲取參數:
void blah(int rr);
或者通過const-reference:
void blah(const int& rr);
你的錯誤信息在哪一行? 看起來你傳入一個long unsigned int
for index,當它需要一個long unsigned int
引用時(換句話說就是long unsigned int
的地址)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.