2014-11-24 325 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