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]; } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 全程使用 AI 从 0 到 1 写了个小工具
· 快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿
· AI 插件第二弹,更强更好用
· Blazor Hybrid适配到HarmonyOS系统