Vector.h:
#include<iostream> using namespace std; const int DEFAULT_CAPACITY=20; template <typename T> class Vector { public: Vector(int capacity=DEFAULT_CAPACITY,int size=0,T const& e=0); void insert(int i,T const& e);//固定位置插入数据; void remove(int i);//删除指定位置数据; T& operator[](int i);//重载[]运算符; void append(T const& e);//末尾追加数据; int size();//获取向量大小; void print();//输出所有数据; int search(T data){//搜索指定数据;返回索引; for(int i=0;i<_size;i++){ if(elem[i]==data){ return i; } } return -1; } protected: void expend(); void shrink(); private: T *elem; int capacity; int _size; };
Vector.cpp
#include"stdafx.h" #include"Vector.h" template <typename T> Vector<T>::Vector(int capacity,int size,const T& e){ this->capacity=capacity; elem=new T[capacity]; this->_size=size; for(int i=0;i<_size;i++){ elem[i]=e; } } template<typename T> void Vector<T>::insert(int i,T const& e){ expend(); for(int j=_size;j>i;j--) elem[j]=elem[j-1]; elem[i]=e; _size++; } template<typename T> void Vector<T>::remove(int rank){ for(int i=rank;i<_size-1;i++){ elem[i]=elem[i+1]; } _size--; shrink(); } template<typename T> T& Vector<T>::operator[](int i){ return elem[i]; } template<typename T>void Vector<T>::append(T const& e){ expend(); insert(_size,e); } template<typename T>int Vector<T>::size(){ return _size; } template<typename T>void Vector<T>::print(){ for(int i=0;i<_size;i++){ cout<<"[ "<<i<<" ]"<<ends<<elem[i]<<endl; } } template<typename T>void Vector<T>::expend(){ if(_size<capacity) return; if(capacity<DEFAULT_CAPACITY) capacity=DEFAULT_CAPACITY; T*oldElem=elem; elem=new T[capacity<<=1]; for(int i=0;i<_size;i++){ elem[i]=oldElem[i]; } delete[]oldElem; } template<typename T>void Vector<T>::shrink(){ if(_size*4>capacity)return; T*oldElem=elem; elem=new T[capacity>>=1]; for(int i=0;i<_size;i++){ elem[i]=oldElem[i]; } delete[]oldElem; }
main.cpp
#include "stdafx.h" #include"Vector.h" int main() { Vector<int> a; a.append(1); a.print(); return 0; }
编译错误:
麻烦大神看下吧,搜了很多,不知道哪里的问题
好像是因为类模板的声明与定义不能分开,你可以试试在main.cpp中加上#include <Vector.cpp>或者将Vector.h和Vector.cpp中的代码放在同一个文件中。
是的,已经试验过了,多谢
类模板不支持分离编译