stack.hpp:
#pragma once
template<typename T>
class Stack
{
public:
Stack(void);
~Stack();
Stack(const Stack&);
Stack& operator=(const Stack&);
unsigned count() {
return vused_;
}
void push(const T&);
T& pop();
private:
T* v_;
unsigned vsize_;
unsigned vused_;
};
stack.cpp:
#include "stack.hpp"
#include<exception>
template<typename T>
Stack<T>::Stack():vsize_(10),vused_(0){
v_ = new T[vsize_];
}
template<typename T>
Stack<T>::Stack(const Stack& stack) {
if (stack.vsize_ > vsize_) {
vsize_ = stack.vsize_;
}
copy(stack.v_->begin(), stack.v_->end(), v_->begin());
}
template<typename T>
Stack<T>& Stack<T>::operator=(const Stack& stack) {
if (stack.vsize_ > vsize_) {
vsize_ = stack.vsize_;
}
copy(stack.v_->begin(), stack.v_->end(), v_->begin());
return *this;
}
template<typename T>
void Stack<T>::push(const T& t) {
if(vused_ >= vsize_ -1 ){
vsize_ = vused_ << 2;
}
delete[] v_;
T v = new T[vsize_];
swap(v_, v);
delete[] v;
v_[vused_] = t;
++vused_;
}
template<typename T>
T& Stack<T>::pop() {
T* t=new T;
try {
swap(*t, v_[vused_]);
}
catch (exception e) {
cout << e << endl;
}
delete v_[vused_];
--vused_;
return *t;
}
template<typename T>
Stack<T>::~Stack() {
vused_ = 0;
vsize_ = 0;
delete[] v_;
v_ = nullptr;
}
main.cpp:
#include<stdio.h>
#include<iostream>
#include"stack.hpp"
int main(void)
{
Stack<int> s;
s.push(10);
s.push(20);
s.push(5.3f);
int i;
for (i = 0; i < 12; ++i) {
s.push(2);
}
return 0;
getchar();
}
编译报错:
1>main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Stack::Stack(void)" (??0?$Stack@H@@QAE@XZ),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Stack::~Stack(void)" (??1?$Stack@H@@QAE@XZ),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall Stack::push(int const &)" (?push@?$Stack@H@@QAEXABH@Z),该符号在函数 _main 中被引用
1>c:\users\ivy\documents\visual studio 2015\Projects\AboutException\Debug\AboutException.exe : fatal error LNK1120: 3 个无法解析的外部命令
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========