C++模板的学习.

来源:互联网 发布:支付宝接口 返回数据 编辑:程序博客网 时间:2024/05/14 20:03

  今天晚上不想上自习, 在宿舍里又闲着没事, 就想到了以前编写C++模板类的时候总或多或少的出现问题.

于是就在上面编写个简单的模板类.代码如下

AA.H 文件

#include <stdexcept>

template<typename T>
class A
{
 public:
  A();
  A(int m, const T& val = A());
  ~A();
  T& operator[](int i)const;
  int Length() const { return size; }
 private:
  T *element;
  int size;
};

在AA.CPP中实现

#include "aa.h"
template<typename T>
T& A<T>::operator [] (int i) const
{
 if(i<0 || i>=size) throw std::out_of_range("index out of range./n");

 return element[i];
}
template<typename T>
A<T>::A() : size(0)
{
  
}
template<typename T>
A<T>::A(int m, const T& val) : size(m)
{
 element = new T[size];
 for(int i = 0; i<size; i++)
  element[i] = val;
}

template<typename T>
A<T>::~A()
{
  delete [] element;

运行时出现错误

error LNK2001: unresolved external symbol "public: __thiscall A<int>::~A<int>(void)" (??1?$A@H@@QAE@XZ)
main.obj : error LNK2001: unresolved external symbol "public: int & __thiscall A<int>::operator[](int)const " (??A?$A@H@@QBEAAHH@Z)
main.obj : error LNK2001: unresolved external symbol "public: __thiscall A<int>::A<int>(int,int const &)" (??0?$A@H@@QAE@HABH@Z)

 

这个问题已经困扰我好长时间了.直到今天还没有完全明白.

模板类并不是真正的类, 只有当实体化的时候才完成了定义,然后拿这个定义才能去建立对象.

可我记得在标准C++里把模板的声明和实现分开在不同的文件里,是不是编译器实现再来有难度,所以就不实现这个功能吗??  希望有高手来指正.