unresolved external symbol错误!请大侠帮忙看下程序

flybywind 2009-10-25 02:01:51

//-------Array.h------
#include <stdexcept>
using namespace std;

template<class T>
class Array
{
protected:
T *data;
unsigned int base;
unsigned int length;
public:
Array();
Array(unsigned int, unsigned int = 0);
~Array();

Array(Array const&);
Array &operator = (Array const&);

T const& operator [] (unsigned int) const;
T& operator [] (unsigned int);

T const* Data()const;
unsigned int Base() const;
unsigned int Length() const;

void SetVal(unsigned int, T);
void SetBase(unsigned int);
void SetLength(unsigned int);
};
//-------Array.cpp------
#include "stdafx.h"
#include "Array.h"

template <class T>
Array<T>::Array() :
data( new T[0] ),
base(0),
length(0)
{}

template <class T>
Array<T>::Array(unsigned int n, unsigned int m) :
data(new T[n]),
base(m),
lengtn(n)
{}

template <class T>
Array<T>::Array(Array<T> const& array) :
data(new T[array.length]),
base(array.base),
length(array.length)
{
for(unsigned int i = 0; i < length; ++i)
data[i] = array.data[i];
}

template <class T>
Array<T> &Array<T>::operator = (Array<T> const& array) :
data(new T[array.length]),
base(array.base),
length(array.length)
{
for(unsigned int i = 0; i < length; ++i)
data[i] = array.data[i];

return *this;
}

template <class T>
Array<T>::~Array()
{ delete []data; }

//提供只读功能,被称为“成员变量存取器”
template <class T>
T const* Array<T>::Data() const
{ return data; }

template <class T>
unsigned int Array<T>::Base() const
{ return base; }

template<class T>
unsigned int Array<T>::Length() const
{ return length; }

//数组下标操作符,提供数组越界检测。有两种重载形式:
//一种对const型数组对象进行操作;另一种对非const型数组对象进行操作
template <class T>
T const& Array<T>::operator [] (unsigned int i) const
{
unsigned int const offset = i + base;
if(offset >= length)
throw out_of_range("invalid positon!");
return data[offset];
}

template <class T>
T& Array<T>::operator [] (unsigned int i)
{
unsigned int const offset = i + base;
if(offset >= length)
throw out_of_range("invalid positon!");
return data[offset];
}

//数组的重调函数,包括基地址的重调和大小重调
template <class T>
void Array<T>::SetBase(unsigned int newBase)
{
if(newBase > length)
throw out_of_range("The new base address can't be larger than total length!");
base = newBase;
}

template <class T>
void Array<T>::SetLength(unsigned int newLen)
{
T* const newdata = new T[newLen];
unsigned int const min =
length < newLen ? length : newLen;
for(unsigned int i = 0; i < min; ++i)
newdata[i] = data[i];
delete []data;
data = newdata;
length = newLen;
}

//赋值函数
template <class T>
void Array<T>::SetVal(unsigned int indx, T val)
{
unsigned int const offset = indx + base;
if(offset >= length)
throw out_of_range("invalid positon!");
data[offset] = val;
}


//-------main---------
#include "stdafx.h"
#include "Array.h"
#include <iostream>
#include <stdexcept>
using namespace std;

int main(int argc, char* argv[])
{
Array<int> ia, ib(0,10);
for(int i = 0; i < ib.Length(); i++)
ib.SetVal(i,i);

ia = ib;
const Array<int> ic(ib);
for(i = 0; i<ia.Length(); ++i)
cout<<ia[i]<<'\t';
cout<<endl;
for(i = 0; i<ic.Length(); ++i)
cout<<ic[i]<<'\t';
cout<<endl;
return 0;
}

错误提示:
DynamicArray.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int>::~Array<int>(void)" (??1?$Array@H@@QAE@XZ)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: int const & __thiscall Array<int>::operator[](unsigned int)const " (??A?$Array@H@@QBEABHI@Z)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: int & __thiscall Array<int>::operator[](unsigned int)" (??A?$Array@H@@QAEAAHI@Z)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int>::Array<int>(class Array<int> const &)" (??0?$Array@H@@QAE@ABV0@@Z)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: class Array<int> & __thiscall Array<int>::operator=(class Array<int> const &)" (??4?$Array@H@@QAEAAV0@ABV0@@Z)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: void __thiscall Array<int>::SetVal(unsigned int,int)" (?SetVal@?$Array@H@@QAEXIH@Z)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: unsigned int __thiscall Array<int>::Length(void)const " (?Length@?$Array@H@@QBEIXZ)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int>::Array<int>(unsigned int,unsigned int)" (??0?$Array@H@@QAE@II@Z)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int>::Array<int>(void)" (??0?$Array@H@@QAE@XZ)
Debug/DynamicArray.exe : fatal error LNK1120: 9 unresolved externals
...全文
146 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hua_cai 2009-10-25
  • 打赏
  • 举报
回复
模板需要把声明和定义的部分放在同一文件,才能编译
中间有一个中文的反括号,注意一下。
flybywind 2009-10-25
  • 打赏
  • 举报
回复
太感谢了。以前没弄过模板类。还真是的,太奇怪了。呵呵
jackyjkchen 2009-10-25
  • 打赏
  • 举报
回复
模板不能用传统的h和cpp文件来分割,要么在h里反过来include cpp文件,要么将实现写到h里。

65,199

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧