c++ - 错误 LNK2019 :unresolved external symbol, c++

标签 c++ visual-studio-2010 linker-errors lnk2019

我已经为 map /字典数据结构编写了一个模板类,并且不断收到这个奇怪的错误(错误 LNK2019:未解析的外部符号)

代码:

AssArray.h:

#pragma once   
template <class K,class D>   
class AssArray   
{   
    int _size;   
    int _position;   
    D* _data;   
    K* _key;  

public:    
     AssArray(int);
    ~AssArray(void);

    const D& operator [](K k) const;
    D& operator [](K k);
};

AssArray.cpp:

#include "StdAfx.h"
#include "AssArray.h"

template <class K,class D>
AssArray<K,D>::AssArray(int size)
{
    _size=size;
    _data = new D[size];
    _key = new K[size];
    _position=0;
}

template <class K,class D>
AssArray<K,D>::~AssArray(void)
{
        delete[] _data;
    delete[] _key;
}

template <class K,class D>
const D& AssArray<K,D>::operator [](K k) const
{
    //Get
    for(int i=0;i<_position;i++)
        if(_key[i]==d)
            return _data[i];
    return NULL;
}

template <class K,class D>
D& AssArray<K,D>::operator [](K k)
{
    //Set
    for(int i=0;i<_position;i++)
        if(_key[i]==d)
            return _data[i];

    if(_position<_size-1)
    {
        _key[position]=d;
        _position++;
        return _data[_position];
    }
    else
    {
        //Implement error handling
    }

}

错误是:
1

"Error  4   error LNK1120: 3 unresolved externals   
C:\Users\*****\Documents\Visual Studio 2010\Projects\OOPLAB4NYARE\Debug
\OOPLAB4NYARE.exe   1   1   OOPLAB4NYARE"

2

Error   1   error LNK2019: unresolved external symbol "public: __thiscall 
AssArray<char *,float>::~AssArray<char *,float>(void)" (??1?$AssArray@PADM@@QAE@XZ)
referenced in function _wmain   C:\Users\*****\Documents\Visual Studio
2010\Projects\OOPLAB4NYARE\OOPLAB4NYARE\OOPLAB4NYARE.obj    OOPLAB4NYARE

3

Error   3   error LNK2019: unresolved external symbol "public: __thiscall
AssArray<char *,float>::AssArray<char *,float>(int)" (??0?$AssArray@PADM@@QAE@H@Z) 
referenced in function _wmain   C:\Users\*****\Documents\Visual Studio 
2010\Projects\OOPLAB4NYARE\OOPLAB4NYARE\OOPLAB4NYARE.obj    OOPLAB4NYARE

4

Error   2   error LNK2019: unresolved external symbol "public: float & 
__thiscall AssArray<char *,float>::operator[](char *)" 
(??A?$AssArray@PADM@@QAEAAMPAD@Z) referenced in function _wmain C:\Users\Jonathan
\Documents\Visual Studio 2010\Projects\OOPLAB4NYARE\OOPLAB4NYARE\OOPLAB4NYARE.obj   
OOPLAB4NYARE

我使用的是 Microsoft visual studio 2010 Ultimate。这很可能是我刚刚忽略的简单问题。

我尝试过清理->重建,创建一个新项目并复制粘贴相关代码,并试图找到解决方案,但我看到的解决方案五花八门且含糊不清。

最佳答案

您不能将类模板的成员函数定义放在 .cpp 文件中。

在处理翻译单元(即 .cpp 文件)调用 时,编译器必须看到类模板的成员函数的定义) 包含该调用。这允许编译器实际生成代码。除非调用这些函数,否则不会发生实例化。

现在,通过将您的函数定义放在一个不包含这些函数调用的 .cpp 文件中,您基本上是:

  1. 将它们密封到其他 .cpp 文件无法看到它们的地方;
  2. 避免在唯一可以看到其定义的 .cpp 文件中对这些函数进行任何实例化。

因此,编译器不会为它们生成任何目标代码,链接器最终会提示找不到相应的符号(这就是你得到的错误)。

要解决此问题,请将类模板的成员函数定义移动到类模板定义所在的同一 header 中(在您的情况下为 AssArray.h),或者在 header 中 #include由调用这些函数的翻译单元(以及调用点之前)进行。

关于c++ - 错误 LNK2019 :unresolved external symbol, c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14843006/

相关文章:

c++ - 调用属于另一个类的函数

c++ - c 中的快速排序代码,64 位 Windows 机器上无法解释的行为

c++ - Lambda 返回空字符串

c# - 访问 Visual Studio 扩展中的当前代码 Pane

c++ - 在 Visual Studio 2010 C++ 项目中使用 MinGW 构建的 dll

c++ - 用新的 QString 优化替换 windowTitle

visual-studio - 有什么方法可以设置每个解决方案的颜色选项(VS2010)?

c++ - 链接器错误 : undefined reference to

ios - 我在看什么?重复的符号?

c++ - "friend std::ostream& operator<<(std::ostream& out, LinkedList& list)"是什么意思?