2 darknec darknec 于 2014.02.24 21:47 提问

vs2010运行程序报错:error LNK2019: 无法解析的外部符号

如题,我在vs2010环境下做C++练习题时出现该错误。程序代码如下:

 //array.h
#ifndef ARRAY_H
#define ARRAY_H
template<typename T>
class Array
{
public:
    Array(int n);//数组首地址不用指定,待会分配
    Array(Array &a);
    ~Array();
    T getAt(int i);//返回第i个数组元素
    void setAt(T x,int i);//将第i个元素设置为x
protected:
private:
    T *array;//数组首地址
    int length;//数组长度
};
#endif

//array.cpp
#include "array.h"
template<typename T>//所有成员函数前必须加模板声明
Array<T>::Array(int n)//成员函数类名后需加<T>
{
    array=new T[n];
    length=n;
}
template<typename T>
Array<T>::Array(Array &a)
{
    length=a.length;
    array=new T[length];
    for(int i=0;i<length;i++)
        array[i]=a.array[i];//数据复制
}
template<typename T>
Array<T>::~Array()
{
    delete []array;
}
template<typename T>
T Array<T>::getAt(int i)
{
    return array[i];
}
template<typename T>
void Array<T>::setAt(T x,int i)
{
    array[i]=x;
}

//test.cpp
#include "array.h"
#include <iostream>
using namespace std;
void main()
{
    int a[]={1,2,3,4,5};
    double b[]={0,0.5,1.0,1.5,2.0};
    Array <int>a1(5);//使用时必须指明传递给类模板的数据类型
    Array <double>b1(5);//必须分两行写
    for (int i=0;i<5;i++)
    {
        a1.setAt(a[i],i);//数据拷给对象
        b1.setAt(b[i],i);
    }
    Array <int>a2(a1);
    for (int i=0;i<5;i++)
    {
        cout<<a1.getAt(i)<<"  "<<a2.getAt(i)<<"  "<<b1.getAt(i)<<endl;
    }
}

具体的报错信息如下:
c: __thiscall Array::~Array(void)" (??1?$Array@N@@QAE@XZ),该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Array::~Array(void)" (??1?$Array@H@@QAE@XZ),该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall Array::getAt(int)" (?getAt@?$Array@H@@QAEHH@Z),该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 "public: double __thiscall Array::getAt(int)" (?getAt@?$Array@N@@QAENH@Z),该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Array::Array(class Array &)" (??0?$Array@H@@QAE@AAV0@@Z),该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall Array::setAt(double,int)" (?setAt@?$Array@N@@QAEXNH@Z),该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall Array::setAt(int,int)" (?setAt@?$Array@H@@QAEXHH@Z),该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Array::Array(int)" (??0?$Array@N@@QAE@H@Z),该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Array::Array(int)" (??0?$Array@H@@QAE@H@Z),该符号在函数 _main 中被引用
1>D:\vsprojects\chaper5\array3\Debug\array3.exe : fatal error LNK1120: 9 个无法解析的外部命令

补充:我将上述代码改写到同一个cpp文件中,发现问题解决。
我重新建立过项目和文件,确定不是建错工程、建错文件等情况。望各位给出一些方向,谢谢!

1个回答

tlxzsz
tlxzsz   2014.02.27 11:24

我将上述代码改写到同一个cpp文件中,发现问题解决,引用头文件中包含了类,
和一些函数声明
而主函数调用的时候是找不到函数体的(默认去系统函数库去找)、
找不到所以链接错误

darknec
darknec 可是,为何找不到函数体呢?
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
VS2010:error LNK2019 :无法解析的外部符号
新的解决方案:error LNK2019
VS调试报错 “error LNK2019: 无法解析的外部符号 ......”
生成解决方案的时候,报错“error LNK2019: 无法解析的外部符号。。。。” 一般来说,这是由于缺少相应的依赖库.lib文件造成的,解决方法就是到【属性管理器】——【通用属性】——【链接器】——【附加依赖项】里添加相应的.lib文件名称。 如果不知道要添加什么.lib文件,首先将【附加依赖项】里的lib文件和你在VS里配置的软件(如OpenCV)文件下的lib文件夹里.lib文
VC6.0工程升级到VS2010遇到问题及解决办法 【LNK2019】 无法解析的外部符号 __iob
 VS2010 解决链接错误:error LNK2019: 无法解析的外部符号 __iob   该错误主要是由于静态库在VC6编译而主程序在VC2010编译,大家用的CRT不同。 解决办法,代码中增加 #ifdef __cplusplus extern "C"  #endif FILE _iob[3] = {__iob_func()[0], __iob_func()[1]
vs2010 error link2019无法解析的外部符号
vs2010 error link2019无法解析的外部符号 一、动机 自己写的Dll库,然后对其进行引用,出现了题中所示的错误。使用了以下步骤的解决办法。 1、引入dll的头文件:属性-》c/c++-》常规-》附加包含目录,在框中加入dll的头文件 2、引入lib库目录:属性-》链接器-》常规-》附加库目录,在框中加入生成dll对应的lib库目录(注意这里加入的是文件目录) 3、引
Qt error: LNK2019: 无法解析的外部符号 解决
一般的 1、确认导包是否正确,尤其自定义的文件 2、构建-->清理项目,然后执行 qmake 特别一点的 3、是否需要修改pro文件 例如:使用QPrintDialog,需要导入 #include pro文件需要添加 QT += core gui printsupport 使用QAxwidget 需要添加 QT
VS2010 error LNK2019: 无法解析的外部符号 _mysql
平台是WIN7 64位+MYSQL 64位 出现以下错误: error LNK2019: 无法解析的外部符号 _mysql_real_connect@32,该符号在函数 _main 中被引用 error LNK2019: 无法解析的外部符号 _mysql_query@8,该符号在函数 _main 中被引用 error LNK2019: 无法解析的外部符号 _mysql_in
(cocos2dx vs2010)Tinyxml error LNK2019的解决方法
2>TinyXmlTest.obj : error LNK2019: 无法解析的外部符号 "public: class TiXmlElement const * __thiscall TiXmlNode::FirstChildElement(void)const " (?FirstChildElement@TiXmlNode@@QBEPBVTiXmlElement@@XZ),该符号在函数 "pub
使用动态库时出现,error LNK2019 无法解析的外部符号可能的解决方法。
1动态库的编译环境和使用动态库的编译环境不一致。 2,导出动态库的头文件中,不能含有函数的实现。
在C++控制台项目中使用C工程代码时的注意,避免出现error LNK2019: 无法解析的外部符号
当我们在写 C++控制台项目时候,有时用到一些线程的算法代码项目,这些代码项目是用c写的。当使用时,需要在c的头文件中标注如下内容,才能使得cpp文件能够编译使用c的函数等,才避免在编译时候出现error LNK2019: 无法解析的外部符号###,在_main中引用,这样的错误。如下面: 号 "int __cdecl sift_features(struct _IplImage *,struc
C++ error LNK2019: 无法解析的外部符号 错误解决方案
今天在实现类模板特例化的时候遇到一个问题,就是把类模板函数实现放到类的cpp文件中,然后在main函数中使用这个类的时候,就会出现无法解析的外部符号:函数名(xxxx)等错误,那么出现这个错误的原因是什么呢? 原因就是现在的编译里不支持模板函数的申明和实现分开,要像上面那样使用类成员函数,有以下两种方法 1. 在使用这个类的文件中包含#include“xxxx.cpp” 2.在类头文件末尾包