類别範本成員函式要不就在類别範本中實現,要不就和類别範本寫在同一個檔案中。
否則然會出現下面錯誤:
>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]; } }