我有一个模板类,当我运行程序时它说
错误LNK2019:无法解析的外部符号“class std::basic_ostream>&__cdecl运算符<&,class CSet&)”(?? 6 @ YAAAV?$ basic_ostream @ DU?$ char_traits @ D @ std @@ std @@ AAV01 @ AAV?$ CSet @ H @@@ Z)在函数“public:void __thiscall Menu::menu(void)”中引用(?menu @ Menu @@ QAEXXZ)
在我尝试使用的任何一种数据结构上,
如果有人可以向我解释为什么打印功能的重载会导致此错误,我将不胜感激。
template <class T> class CSet{
T* Array;
int size;
public:
CSet()
{
Array = NULL;
size = 0;
}
CSet(CSet& other){
size = other.size;
Array = new T[size];
for (int i = 0; i < size; i++)
Array[i] = other.Array[i];
}
friend ostream& operator <<(ostream& out, CSet& other);
~CSet()
{
if (size > 0)
delete[] Array;
}
};
template <class T> ostream& operator <<(ostream& out, CSet<T>& other){
out << "(";
for (int i = 0; i < other.size; i++){
if (size>1)
out << other.Array[i] < ",";
else
out << other.Array[i];
}
out << ")" << endl;
return out;
}
最佳答案
friend
声明不声明函数模板,而是为类模板的每个实例化单独的函数。因此,您定义的模板与这些函数不同,它们仍未定义。
有两种解决方法。
在类中定义friend
运算符,而不是仅在其中声明它:
friend ostream& operator <<(ostream& out, CSet& other) {
// implementation
}
或在类定义之前声明函数模板:
template <class T> class CSet;
template <class T> ostream& operator <<(ostream& out, CSet<T>&);
并声明该模板为好友:
friend ostream& operator << <T>(ostream& out, CSet&);
^^^