xingyuncoco 2017-08-07 10:02 采纳率: 100%
浏览 2160
已采纳

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

  • 写回答

4条回答

  • 郭建堂 2017-08-09 03:26
    关注

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝