类模板成员函数要不就在类模板中实现,要不就和类模板写在同一个文件中。
否则然会出现下面错误:
>main.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall vec<int>::pop_back(void)" (?pop_back@?$vec@H@@QAEHXZ),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall vec<int>::push_back(int)" (?push_back@?$vec@H@@QAEXH@Z),该符号在函数 _main 中被引用
示例如下:
main.cpp
#include <iostream> #include "vec.h" using namespace std; int main() { vec<int> s; s.push_back(1); s.push_back(2); s.push_back(3); s.push_back(5); s.push_back(6); try { while (1) cout<<s.pop_back()<<endl; } catch (const runtime_error &e) { cerr<<e.what()<<endl; } system("pause"); }
vec.h
#pragma once template<class T> class vec { public: vec() :vect(new T[capacity]), capacity(3), size(0){}; ~vec() { delete[] vect; } int capacity; int size; T *vect; void push_back(T t); T pop_back(); }; template<class T> void vec<T>::push_back(T t) { if(size==capacity) { capacity=capacity*2; T *tmp_vec=new T[capacity]; for(int i=0;i<size;i++) //我想这里一个个复制并不理想,做个数据结构,用指针连接也许更好 tmp_vec[i]=vect[i]; //不过用指针连接,速度上去了,运行空间也变大了 delete[] vect; vect=tmp_vec; } vect[size]=t; size++; } template<class T> T vec<T>::pop_back() { if(size==0) throw std::runtime_error("vect is empty"); else { size--; return vect[size]; } }