Ошибка: ни один экземпляр перегруженной функции «BSTree :: Retrieve» не соответствует списку аргументов и объекту (у объекта есть квалификаторы типа, которые не позволяют сопоставить).
Типы аргументов: (int
, Account*
, BSTree::Node*const
)
Тип объекта: const BSTree
Это говорит, что тип аргумента Account *
но у меня это как Account *&acct
,
Первый параметр — это объект для извлечения. Второй содержит указатель на найденный объект.
Вот код:
bool BSTree::Retrieve(int ID, Account *&acct, Node *leaf)
{
if(leaf != NULL)
{
if(ID == leaf->pAcct->getID())
{
acct = leaf->pAcct;
return true;
}
if(ID < leaf->pAcct->getID())
{
return Retrieve(ID, acct, leaf->left);
}
else
{
return Retrieve(ID, acct, leaf->right);
}
}
else
{
acct = NULL;
return false;
}
}
bool BSTree::Retrieve(int ID, Account *&acct) const
{
return Retrieve(ID, acct, root);
}
Вы вызываете неконстантный метод (который может модифицировать объект) из константного метода (который не может этого делать). Это будет ошибка.
Ты уверен что хочешь Account *&
? Из вашего кода, если вы хотите получить узел по его идентификатору из BSTree, вам понадобится Account*
,
Для пункта 1 увидеть Вот.
a.g(); // invokes an error because g() (which is const) calls f() which is non-const.
Account *&acct
это указатель на ссылку.
Это означает, что acct
будет действовать как ссылка на указатель в качестве аргумента. То, что ваша функция ожидает в качестве аргумента, передает фактический указатель, а не существующую ссылку.
Вы можете попробовать это:
bool BSTree::Retrieve(int ID, Account *&acct) const
{
Account* acctPtr = acct;
return Retrieve(ID, acctPtr, root);
}
Вы можете посмотреть на похожий случай Вот.
Кроме того, вы пытаетесь вызвать неконстантная метод из Const один. Вы могли бы использовать const_cast
для того, чтобы это исправить, но это НЕ рекомендуется, так как это опасно, и вы должны искать лучшие альтернативы (смотрите Вот для большего).