【问题标题】:I need help fixing an error message - "error LNK2019: unresolved external symbol"我需要帮助修复错误消息 - “错误 LNK2019:未解析的外部符号”
【发布时间】:2013-04-29 21:21:35
【问题描述】:

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

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

【问题讨论】:

  • 头文件中的所有内容

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


【解决方案1】:

一种可能的解决方案是在类主体中定义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 条目详细说明了为什么在这种情况下需要特殊解决方法。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 2012-08-31
      • 1970-01-01
      • 2015-06-03
      相关资源
      最近更新 更多