2016-07-04 2 views
4

я получил неприятности undertanding следующее сообщение об ошибке:Почему это возвращает const const const const const const внутри метода const?

Error 1 error C2440: '=' : cannot convert from 'const X<...> *const ' to 'X<...> *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 тип и не может использоваться как * Const *?

Как метод метод 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, пытался сосредоточиться на ошибки - исправлены версии: BOOL IsValid() Const { Const BST ** previousNode = новый Const 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 const для нового объекта const Но кажется, что * const * является неконстантным указателем на значение const, и этот указатель не может быть изменен. Тогда, когда синтаксис * const * будет воспринимать? –

+1

Дело в том, что есть 2 *, так что здесь есть двойная косвенность. Вы объявили previousNode не указателем const для указателя const. Это может иметь смысл, например, если вы хотите защитить указатель, на который вы указываете (см. [Онлайн-демонстрацию] (http://ideone.com/NKVs0Z)). Это может иметь смысл, например, если существует риск того, что previousNode указывает на указатель, который является членом X (поскольку isValid() сам является константой, и вы должны обеспечить это обещание, то есть функция-член не будет случайно изменять состояние состояния объекта – Christophe

+0

Спасибо, очень ясно. –

3

Сигнатура метода в IsValid специфицирует (с помощью const), что this является постоянным объектом, то есть его тип const X*. Изменение типа previousNode на const X** должно решить вашу проблему.

Смежные вопросы