每当我尝试编译
时,我都会收到此错误消息Error 6 error LNK2019: unresolved external symbol "void __cdecl MergeSort(class LinkedList<int> &)" (?MergeSort@@YAXAAV?$LinkedList@H@@@Z) referenced in function _main C:\Users\FOla Yinka\Documents\Visual Studio 2012\Projects\C++\C++\linkedlist.obj C++
Error 7 error LNK1120: 1 unresolved externals C:\Users\FOla Yinka\Documents\Visual Studio 2012\Projects\C++\Debug\C++.exe 1 1 C++
我的头文件中有这个
template<typename T>
class LinkedList{
protected:
public:
friend void MergeSort(LinkedList<T> &list);
};
template<typename T>
void MergeSort(LinkedList<T> &list){
}
为了检查错误是否在函数声明中,我关闭了所有protected
成员public
并删除了友谊,因此MergeSort
可以访问所有成员,然后程序编译成功。我不知道为什么我会收到此错误消息。
答案 0 :(得分:3)
一种可能的解决方案是在类体中定义friend
:
template<typename T>
class LinkedList{
protected:
public:
friend void MergeSort(LinkedList<U> &list)
{}
};
另一个解决方案是在类主体之前声明friend
,以便它知道friend
是template
:
template <typename T> class LinkedList ;
template <typename T> void MergeSort(LinkedList<T> &list) ;
然后在类体中声明friend
,如下所示:
friend void MergeSort<>(LinkedList<T> &list) ;
此C++ FAQ条目详细说明了为什么在这种情况下需要特殊解决方法。
答案 1 :(得分:3)
问题是,一旦你的类模板被实例化为(例如)T=int
,friend
声明就会声明存在非模板函数:
friend void MergeSort(LinkedList<int> &list);
在您的代码中,此功能不存在。有一个名为MergeSort()
的函数模板,但这与您声明为friend
的内容不同。