• c++类模板成员函数报错


    类模板成员函数要不就在类模板中实现,要不就和类模板写在同一个文件中。

    否则然会出现下面错误:

    >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];
        }
    }
  • 相关阅读:
    exit()和_exit()的比较(与前一篇日志行缓冲区有关)
    标准IO缓冲详解全缓冲、行缓冲、不缓冲
    windows与unix/linux下输入回车换行的区别
    strtok()的用法
    头文件的处理
    feof()出现的问题及解决办法
    测试题
    视觉十四讲:第十二讲_八叉树地图
    树莓派4B安装OPENCV4.0
    编译OpenCV以及openc_contrib提示缺少boostdesc_bgm.i文件出错的解决
  • 原文地址:https://www.cnblogs.com/tiandsp/p/3299729.html
Copyright © 2020-2023  润新知