簡體   English   中英

沒有從long unsigned int轉換為long unsigned int&

[英]No conversion from long unsigned int to long unsigned int&

我收到錯誤消息沒有已知的轉換參數2從long unsigned intlong 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM