我试图搜索,但我找不到解决方案,问题的含义是什么。
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);
答案 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;
}