首页 文章

错误LNK2019:未解析的外部符号

提问于
浏览
1

我有一个模板类,当我运行该程序时,它说

错误LNK2019:未解析的外部符号“class std :: basic_ostream>&__ cdecl operator <<(class std :: basic_ostream>&,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;
}

1 回答

  • 3

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

相关问题