C++模板的学习.
2007-04-04 20:10
274 查看
今天晚上不想上自习, 在宿舍里又闲着没事, 就想到了以前编写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++里把模板的声明和实现分开在不同的文件里,是不是编译器实现再来有难度,所以就不实现这个功能吗?? 希望有高手来指正.
于是就在上面编写个简单的模板类.代码如下
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++里把模板的声明和实现分开在不同的文件里,是不是编译器实现再来有难度,所以就不实现这个功能吗?? 希望有高手来指正.
相关文章推荐
- C++ 函数模板和排序的函数模板——学习笔记
- C++模板学习
- C++学习笔记57——非类型模板形参与泛型代码原则
- C++类模板定义与实现的分离—学习C++数据抽象和问题求解
- C++学习之函数模板
- C++学习笔记之类模板
- template template parameter模板模板参数笔记----C++学习之路
- 金庸小说考试之模板方法模式学习笔记[C++版]
- 学习C++模板,初体验
- C++与C#对比学习:模板,泛型
- C++学习笔记(2)----模板
- c++学习笔记(模板)(一)
- C++学习笔记之模板
- C++模板学习
- C++学习---模板
- c++ 模板学习笔记:类模板和函数模板实现pair(权哥)
- C++学习----类模板
- [置顶]C++学习笔记之模板篇
- C++学习笔记五——函数重载(多态)、函数模板及函数模板重载和完全匹配与最佳匹配
- C++学习摘要之八:模板 .