2014-11-24 268 views
0

我遇到了一個私人遞歸幫助函數,我在指針中傳遞了一個引用的問題。我得到的是說將指針傳遞給指針

錯誤insertSymbol「的重載功能無實例‘’參數列表匹配參數類型是:(字符串表達式*)」

我想我誤解的東西關於通過引用。有人可以幫我嗎?

struct ExpressionTree { 
    private: 
     Expression* root; 

     bool insertSymbol(String& symbol, Expression*& root) { 
      if (root == nullptr) { // base case 
       root = new Expression(symbol); 
       return true; 
      } 

      if ((*(*root).getSymbol()).c_str()[0] == '~') { 
       return insertSymbol(symbol, (*root).getLeftChild()); // Error occurs here 
      } 
     } 

    public: 
     ExpressionTree(void) { 
      root = 0x00; 
     } 

     // returns true if insert was successful, otherwise returns false 
     bool insertSymbol(String& symbol) { 
      if (symbol.size == 0) return false; 
      return insertSymbol(symbol, root); // Calls recursive helper function 
     } 
}; 
+1

我們無法知道'getLeftChild'是什麼或返回什麼。但它看起來像你試圖綁定一個臨時的引用,這是不允許的。 – 2014-11-24 03:34:22

回答

2

您不能將引用綁定到臨時。一種可能的修復方法是:

bool insertSymbol(String& symbol, Expression*& root) { 
    if (root == nullptr) { // base case 
     root = new Expression(symbol); 
     return true; 
    } 
    return insertSymbolHelper(symbol, root); 
} 

bool insertSymbolHelper(String& symbol, Expression* root) { 
    if ((*(*root).getSymbol()).c_str()[0] == '~') { 
     return insertSymbolHelper(symbol, (*root).getLeftChild()); // Error occurs here 
    } 
    // rest of code goes here 
} 
+0

儘管我沒有看到足夠的代碼可以肯定,但我敢打賭,這個修復會在第二次調用insertSymbol時導致無效的指針解引用。 – 2014-11-24 03:48:13

+0

@BenjaminLindley我假設'getLeftChild'不能返回NULL。如果可以的話,那麼需要更多的改變。 (也許'getLeftChild'應該返回一個引用?) – 2014-11-24 03:54:44