2014-11-24 2 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'가 무엇인지 또는 어떤 결과가 반환되는지 알 수 없습니다. 하지만 임시로 참조를 바인딩하려는 것 같습니다. 허용되지 않습니다. –

답변

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'이 두 번째 호출 될 때 잘못된 포인터 역 참조를 초래할 것이라고 확신합니다. –

+0

@BenjaminLindley'getLeftChild'가 NULL을 반환 할 수 없다고 가정합니다. 가능한 경우 더 많은 변경이 필요합니다. (아마'getLeftChild'는 참조를 리턴해야합니까?) –