模板二进制搜索树ostream重载问题

时间:2017-01-03 00:34:41

标签: c++ data-structures operator-overloading

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

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);

1 个答案:

答案 0 :(得分:0)

重载运算符&lt;&lt;和运算符&gt;&gt;在模板类中有点特别。只需对此声明发表评论,它就会起作用:

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

这是因为friend函数实际上不是该类的成员函数。重载运算符&lt;&lt;在类外定义的函数实际上定义了一个新的模板函数,不同于在类中声明的函数。虽然它们具有相同的模板类T&#39;但实际上它们是不同的功能。所以编译错误告诉你运算符&lt;&lt;该类的功能未定义。

因为我们已经重载了一个新的模板运算符&lt;&lt;在课外,我们可以摆脱在类中声明的友元函数。以下代码将起作用,我会更改其他一些功能以便进行详细说明:

#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;
}