3

每当我尝试编译时,我都会收到此错误消息

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可以访问所有成员,然后程序编译成功。我不知道为什么我会收到此错误消息。

4

2 回答 2

3

一个可能的解决方案是friend在类体内定义:

template<typename T>
class LinkedList{
      protected:

      public:
        friend void MergeSort(LinkedList<U> &list)
        {}
};

另一种解决方案是friend在类主体之前声明 ,以便它知道friend是 a template

template <typename T> class LinkedList ;
template <typename T>  void MergeSort(LinkedList<T> &list) ;

然后在类主体中声明friend如下:

friend void MergeSort<>(LinkedList<T> &list) ;

C++ FAQ条目详细介绍了为什么在这种情况下需要特殊解决方法。

于 2013-04-29T21:24:44.317 回答
3

问题是一旦你的类模板被实例化为 (say) T=intfriend声明就声明了一个非模板函数的存在:

 friend void MergeSort(LinkedList<int> &list);

在您的代码中,此函数不存在。有一个名为 的函数模板MergeSort(),但这与您声明为friend.

于 2013-04-29T21:31:09.603 回答