2015-11-16 2 views
0

Функция предоставляет функции вызовов, расположенные в разных классах, с функцией height(), находящейся в классе, который объявляет AVLTree в качестве друга. Тем не менее, у меня возникли проблемы с вызовом функции height(). Функция isExternal() является прямым членом класса TPos, но height() не является (однако, он является другом класса AVLTree, который наследует класс, которому принадлежит isExternal()).Доступ к защищенному члену из класса друзей

template <typename T> 
int AVLTree<T>::height(const TPos& v) const { 
    return (v.isExternal() ? 0 : v->height()); 
} 

Когда я компилирую с помощью Xcode, я получаю следующее сообщение об ошибке:

Member reference type 'const TPos' (aka 'const BinaryTree<AVLEntry<Entry<std::__1::basic_string<char>, std::__1::basic_string<char> > > >::Position') is not a pointer; maybe you meant to use '.'? 

Проблема заключается в том, что оператор точка прицелы неправильно. Я знаю, что это, вероятно, тривиально, но уже поздно, и я застрял. Предложения?

+0

Не следует ли 'v-> height' быть' v.height'? Указатель 'TPos'? Использует ли он 'operator->'? –

+0

№ Функция высоты не находится в пределах этого класса. Я пытаюсь получить доступ к члену, находящемуся внутри класса, который объявил это как класс друга. – badfilms

+1

Имеет ли 'TPal' функцию-член под названием' height'? Вызывает ли класс 'TPal'? Код 'v-> height()' имеет смысл только в том случае, если 'TPal' является типом указателя или реализует' operator-> '. Если нет, это не имеет смысла. Чтобы исправить это, нам нужно было знать, что вы пытаетесь сделать. Какой объект реализует функцию под названием 'height'? –

ответ

0

Указание стрелки v-> height() - это то же самое, что и (* this) .height(), функционально эквивалентное v.height() при использовании в теле определения класса.

Если высота является другом, то это не может быть метод класса Tpos, поэтому обозначение стрелки не имеет смысла. Попробуйте заменить v-> height() на CLASS :: height (v) или любой другой правильный высотный вызов.