我需要帮助修复错误消息 - “错误LNK2019:未解析的外部符号”

时间:2013-04-29 21:21:36

标签: c++ class templates visual-c++ visual-studio-2012

每当我尝试编译

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

2 个答案:

答案 0 :(得分:3)

一种可能的解决方案是在类体中定义friend

template<typename T>
class LinkedList{
      protected:

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

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

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=intfriend声明就会声明存在非模板函数:

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

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