c++ 的模板问题,如何定义构造函数

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 个 ==========

c++

4个回答

C++里的编译方式是独立编译,也就是一个CPP文件为一个独立的进行编译。

类模板需要二次编译,定义的时候编译一次,实例化的时候编译一次。类模板分为 .h .cpp文件的时候,在.cpp的文件里并没有实例化。而在测试cpp里实例化的时候编译器找不到具体的函数实现。

http://blog.csdn.net/ram_mam/article/details/76910421

没有链接成功,试试清理一下再试,或者参考我的
http://blog.csdn.net/what951006/article/details/53076670

模板类比较特殊 必须放到一个文件中
都放到.h里 .cpp里不要有

想要实现分离 请参考一下文章 或者百度
http://www.jianshu.com/p/3a7a41d46645

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问