模板二叉搜索树 ostream 过载问题

Template Binary Search Tree ostream overloading issue

本文关键字:问题 ostream 搜索树      更新时间:2023-10-16

>我试图搜索,但找不到解决方案以及问题的含义是什么。

friend ostream & operator<<(ostream &os, const BST<T> &rhs);
void helperFunc(ostream & os, Node<T> *root) const;

定义是:

template<class T>
ostream & operator<<(ostream & os, const BST<T> &rhs)
{
    rhs.helperFunc(os, rhs._root);
    os << endl;
return os;
}
template<class T>
void BST<T>::helperFunc(ostream & os, Node<T> *root) const
{
    if (root != NULL)
{
    helperFunc(os, root->left);
    os << root->value << " ";
    helperFunc(os, root->right);
    }
}

我主要使用:

void main()
{
BST <int> a;
a.insert(5)
cout << a;
}

我收到以下错误消息:

Error   LNK2019 unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class BST<int> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$BST@H@@@Z) referenced in function _main...    

如果需要,将提供任何其他信息。

解决方案是:

template <typename U>
friend ostream & operator<<(ostream & os, const BST<U> &obj);
模板类中的

载运算符<<和运算符>>有点特殊。只需评论此声明,它将起作用:

friend ostream & operator<<(ostream &os, const BST<T> &rhs);

这是因为友元函数实际上不是类的成员函数。在类外部定义的重载运算符<<函数实际上定义了一个新的模板函数,与类中声明的函数不同。虽然它们具有相同的"模板类T",但它们确实是不同的功能。因此,编译错误告诉您未定义类的运算符<<函数。

由于我们在类外重载了一个新的模板运算符<<我们可以摆脱在类中声明的 friend 函数。以下代码将起作用,我更改了一些其他功能以进行很好的解释:

#include <iostream>
using namespace std;
template<class T>
class Node {
};
template<class T>
class BST {
public:
// friend ostream & operator<<(ostream & os, const BST<int> &rhs);
    void helperFunc(ostream & os, Node<T> *root) const;
};
template<class T>
ostream & operator<<(ostream & os, const BST<T> &rhs)
{
    cout << "success" << endl;
    // rhs.helperFunc(os, rhs._root);
    // os << endl;
    return os;
}
template<class T>
void BST<T>::helperFunc(ostream & os, Node<T> *root) const
{
    if (root != NULL)
{
    helperFunc(os, root->left);
    os << root->value << " ";
    helperFunc(os, root->right);
    }
}
int main()
{
    BST<int> a;
    // a.insert(5);
    cout << a;
}