2016-07-04 80 views
4

我煩惱undertanding以下錯誤:爲什麼在const方法中返回一個const X * const指針?

Error 1 error C2440: '=' : cannot convert from 'const X<...> *const ' to 'X<...> *const '

我試圖用一個指針爲const指針跟蹤節點的樹遍歷期間:

bool IsValid() const 
    { 
    X* const* previousNode = new X*; 
    return this->IsValid(previousNode); 
    } 

    bool IsValid(X* const* previousNode) const 
    { 
    ... 
    if (!*previousNode) 
     *previousNode = this; // Error 
    ... 

    return true; 
    } 

爲什麼是一個const X * const類型並且不能用作*常量 *?

由於該方法是一個常量方法,我的理解是它可以保護被修改的對象本身。那麼爲什麼編譯器試圖強制指向返回指針的指針的常量呢?

我一直無法找到使用堆棧溢出搜索引擎的這個問題的答案。

謝謝你的回答。

這裏是壓軸的代碼,我終於用,如果我能成爲一個人使用:

bool IsValid() const 
    { 
    std::unique_ptr<const BST*> previousNode = std::unique_ptr<const BST*>(new const BST*); 
    *previousNode = nullptr; 
    return this->IsValid(prevNode); 
    } 

bool IsValid(std::unique_ptr<const BST*>& previousNode) const 
{ 
    // Recurse on left child without breaking if not failing 
    if (this->leftChild &&!this->leftChild->IsValid(previousNode)) 
    return false; 

    // First node retrieved - assign 
    if (!*previousNode) 
    *previousNode = this; 
    // Previous data does not compare well to the current one - BST not valid 
    else if (!Compare()((*previousNode)->data, this->data)) 
    return false; 

    // Set current node 
    *previousNode = this; 

    // Recurse on right child 
    if (this->rightChild && !this->rightChild->IsValid(previousNode)) 
    return false; 

    return true; 
} 

與模板和簡單的數據結構只是在玩。 謝謝你的回答。

+2

傳遞一個未初始化的指針到'IsValid' –

+0

THX,試圖把重點放在錯誤 - 校正版本: 布爾的IsValid()const的 { const的BST ** previousNode =新常量BST *; * previousNode = nullptr; return this-> IsValid(previousNode); } bool IsValid(const BST ** previousNode)const –

回答

4

讓我們從簡單的開始:

  • 一個const X*是一個指向常量X
  • 一個const X* const是一個常量指針到常量X
  • 一個const X* const*是一個指向一個常量指針恆

回到你的問題:

  • X* const* previousNode是一個指向一個常量指針到X
  • 所以*previousNode是一個常量指針到X
  • *previousNode = ...嘗試一些分配給該常量指針。這是不可能的,指針是不變的!
+0

對我以前的理解* previousNode = ...意思是: 我的非常量指針值是一個常量對象 我將我的非常量指針值賦值給一個新的const對象 但是,* const *似乎是const常量上的一個非常量指針,並且此指針不能被修改。 然後,當* const *語法會使sens? –

+1

事情是有2 *所以這裏有一個雙重間接。你已經聲明瞭previousNode是一個非const指針指向一個const指針。例如,如果要保護指向的指針,請參閱[在線演示](http://ideone.com/NKVs0Z))。例如,如果previousNode指向一個指向X的成員的指針(因爲isValid()本身是const並且您必須確保這個承諾,也就是說成員函數不會意外地修改狀態的狀態的對象。 – Christophe

+0

謝謝,非常清楚。 –

3

IsValid方法的簽名指定(通過使用const),this是一個常量對象,即其類型是const X*。將previousNode的類型更改爲const X**可以解決您的問題。

相關問題