Функция-член внутри шаблонной перегрузки оператора не работает - PullRequest
0 голосов
/ 29 февраля 2020

Моя функция printTree не будет работать в перегруженном операторе ostream. Ошибка и код ниже.

Код ошибки: C3861 ('printTree': идентификатор не найден)

Описание: 'printTree': функция не была объявлена ​​в контексте определения шаблона и может быть найдена только через зависимый от аргумента поиск в контексте создания

Объявление класса

#pragma once
#include "BSTNode.h"
#include <iostream>
template <typename T> class BST;
template <typename T>
std::ostream& operator<<(std::ostream& out, const BST<T>& rhs);

template <typename ItemType>
class BST
{
private: 
    BSTNode<ItemType>* root;
    BSTNode<ItemType>* insert(ItemType* &data, BSTNode<ItemType>* root);
    BSTNode<ItemType>* remove(const ItemType &x, BSTNode<ItemType>* root);
    BSTNode<ItemType>* findMin(BSTNode<ItemType>* root) const;
    BSTNode<ItemType>* findMax(BSTNode<ItemType>* root) const;
    bool search(const ItemType &data, BSTNode<ItemType>* root) const;
    void destroyTree(BSTNode<ItemType>* root); //for destructor
    BSTNode<ItemType>* clone(BSTNode<ItemType>* root) const;
    void printTree(std::ostream& out, BSTNode<ItemType>* root) const;

public:  
    BST();
    ~BST();
    BST(const BST &rhs); 
    BSTNode<ItemType>* getRoot() const {return root;}
    bool isEmpty(); 
    void insert(ItemType* &data);
    bool remove(const ItemType &x);
    ItemType findMin() const; 
    ItemType findMax() const;
    bool search(const ItemType &data) const;
    friend std::ostream& operator<< <>(std::ostream & out ,const BST<ItemType> &rhs);  
    void printTree (std::ostream &out = std::cout) const; 
};

Соответствующие методы

template <typename ItemType>
void BST<ItemType>::printTree(std::ostream& out, BSTNode<ItemType>* root) const
{
   if (root != nullptr)
   {
      printTree(out, root->getLeft());
      out << *(root->getData()) << std::endl;
      printTree(out, root->getRight());
   }
}


template <typename ItemType>
std::ostream& operator << <>(std::ostream & out , const BST<ItemType> &rhs)
{
   printTree(out, rhs.getRoot());
   return out; 
}

Решено:

Необходимо добавить вызывающий объект в функцию printTree в определении перегрузки оператора

template <typename ItemType>
std::ostream& operator << <>(std::ostream & out , const BST<ItemType> &rhs)
{
   rhs.printTree(out, rhs.getRoot());
   return out; 
}

1 Ответ

0 голосов
/ 29 февраля 2020
std::ostream& operator<<(std::ostream& out, const BST<T>& rhs);
friend std::ostream& operator<< <>(std::ostream & out ,const BST<ItemType> &rhs);

Имейте <> как разницу, поэтому я не уверен, что это ваша ошибка. То же самое с методом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...