当前位置:
C++模板坑,一起来issue
时间:2025-11-05 16:00:22 出处:IT科技类资讯阅读(143)

C++开发中通常将类定义放在C ++头文件(.h)中,板坑并将实现放在C ++源文件(.cpp)中。板坑然后,板坑将源文件作为项目的板坑一部分,这意味着将其单独编译。板坑但是板坑,当我们对模板类实施此过程时,板坑将出现一些编译和链接问题。板坑
本文阐述了三种可能的板坑解决方案,帮助大家可以在实现该模板的板坑源文件中创建一个模板类的对象,解决上述问题。企商汇板坑
问题复现
头文件声明:
// temp.h #ifndef _TEMP_H_ #define _TEMP_H_ #include <iostream> #include <vector> template <typename T> using Vec = std::vector<T>; #define PRINTFMT(x) std::cout << x << " "; template <typename T> void TestTemp(const Vec<T> &v,板坑 T target); #endif头文件实现:
#include "temp.h" template <typename T> void TestTemp(const Vec<T> &v, T target) { [=]() { for (auto elem : v) if (elem == target) PRINTFMT(elem); }(); }报错:
undefined reference to....问题描述:当在.h中声明了模板,.cpp中定义了模板,板坑当main函数去进行模板实例化的板坑时候,在声明处找不到对应的板坑T类型,自然就出问题了。
1.第一种:同一文件
声明及定义都在.h文件中。
// temp.h #ifndef _TEMP_H_ #define _TEMP_H_ #include <iostream> #include <vector> template <typename T> using Vec = std::vector<T>; #define PRINTFMT(x) std::cout << x << " "; template <typename T> void TestTemp(const Vec<T> &v, T target) { [=]() { for (auto elem : v) if (elem == target) PRINTFMT(elem); }(); } #endif2.第二种:分离开+引入头文件
采用头文件声明,cpp定义,要想起作用,得在使用处引入两者并且定义处得用特化版本。
例如:
头文件实现:
// Temp.cpp #include "temp.h" void TestTemp(const Vec<int> &v, int target) { [=]() { for (auto elem : v) if (elem == target) PRINTFMT(elem); }(); } template <typename T> void TestTemp(const Vec<T> &v, T target) { [=]() { for (auto elem : v) if (elem == target) PRINTFMT(elem); }(); }实现:
#include "temp.h" #include "temp.cpp" int main() { std::vector<int> v{1,2,3}; int target = 2; TestTemp<int>(v,target); return 0; }3.在末尾引入cpp
只需要在.h头文件末尾引入cpp即可。
头文件只需要声明:
// temp.h #ifndef _TEMP_H_ #define _TEMP_H_ #include <iostream> #include <vector> template <typename T> using Vec = std::vector<T>; #define PRINTFMT(x) std::cout << x << " "; template <typename T> void TestTemp(const Vec<T> &v, T target); #include "temp.cpp" #endif头文件定义即可:
// Temp.cpp #include "temp.h" template <typename T> void TestTemp(const Vec<T> &v, T target) { [=]() { for (auto elem : v) if (elem == target) PRINTFMT(elem); }(); }调用处正常调用:
#include "temp.h" int main() { std::vector<int> v{1,2,3}; int target = 2; TestTemp<int>(v,target); return 0; }在一些开源项目中,这种方式比较常见,云南idc服务商只不过这里的.cpp得改为.hpp。其余不变!
4.总结
本节针对日常代码中的难点进行了梳理,提出了几种解决方案。可以简单的把模板理解为一种特殊的宏,模板类不要当作类,在被实例化的时候一定得找到定义,不然只看到声明,就GG了。
分享到:
温馨提示:以上内容和图片整理于网络,仅供参考,希望对您有帮助!如有侵权行为请联系删除!
猜你喜欢
- 索尼A7S2自动对焦性能分析(探索A7S2自动对焦功能的革新与优势)
- 华硕灵耀3(颠覆传统设计,突破性能瓶颈,华硕灵耀3为你带来全新体验)
- 小米Note2做工精细可靠(深入解析小米Note2的做工质量与可靠性)
- 联想320笔记本测评(性能稳定可靠,适合日常办公)
- 安装命令: 功能说明:检查、设定系统的各种服务。 语法:chkconfig [--add][--del][--list][系统服务]或 补充说明:这个是redhat公司遵循gpl规则所开发的程序,它可以查询操作系统在每一个执行等级(runlevel)中,会执行哪些系统服务,其中包括各种daemon。 linux os 将操作环境分为以下7个等级: 0:开机(请不要切换到此等级) 参数: --add 新增所指定的系统服务 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。 语法: chkconfig --list [name] chkconfig 没有参数运行时,显示用法。假如加上服务名,那么就检查这个服务是否在当前运行级启动。假如是,返回true,否则返回false。假如在服务名后面指定 了on,off或者reset,那么chkconfi 会改变指定服务的启动信息。On和off分别指服务被启动和停止,reset指重置服务的启动信息,无论有问题的初始化脚本指定了什么。On和off开 关,系统默认只对运行级3,4,5有效,但是reset可以对所有运行级有效。 --level选项可以指定要查看的运行级而不一定是当前运行级。 需要说明的是,对于每个运行级,只能有一个启动脚本或者停止脚本。当切换运行级时,init不会重新启动已经启动的服务,也不会再次去停止已经停止的服务。 chkconfig --list :显示所有运行级系统服务的运行状态信息(on或off)。假如指定了name,那么只显示指定的服务在不同运行级的状态。 chkconfig --add name:增加一项新的服务。Chkconfig确保每个运行级有一项启动(S)或者杀死(K)入口。如有缺少,则会从缺省的init脚本自动建立。 chkconfig --del name:删除服务,并把相关符号连接从/etc/rc[0-6].d删除。 chkconfig [--level levels] name :设置某一服务在指定的运行级是被启动,停止还是重置。例如,要在3,4,5运行级停止nfs服务,则命令如下: chkconfig --level 345 nfs off 运行级文件: 每个被chkconfig管理的服务需要在对应的init.d下的脚本加上两行或者更多行的注释。第一行告诉chkconfig缺省启动的运行级以及启动 和停止的优先级。假如某服务缺省不在任何运行级启动,那么使用 - 代替运行级。第二行对服务进行描述,可以用/ 跨行注释。 附加介绍一下Linux系统的运行级的概念: 范例: 1.查看在各种不同的执行等级中,各项服务的状况: 2.列出系统服务vsftpd在各个执行等级的启动情况: 3.在执行等级3,5时,关闭vsftpd系统服务: 4.在执行等级2,3,5时,开启 vsftpd系统服务: 5.关闭一些自己不需要的服务 ->假如没有打印机: chkconfig --level 235 cups off 假如没有局域网: chkconfig --level 235 smb off 假如不需要远程用户登录的: chkconfig --level 235 sshd off 假如不需要定时任务的: chkconfig --level 235 crond off 假如不需要添加新硬件的: chkconfig --level 235 kudzu off
- 玖嘉久一体电脑的性能及功能综合评估(打造高效便捷的工作与娱乐平台)
- HTCU11(探索HTCU11的创新功能与卓越性能)
- 探索HD4000M显卡的性能和功能(一款强大的集成显卡,适合轻度游戏和日常使用)
- 为了方便开发人员在Visual Studio中使用GitHub,微软联合GitHub为Visual Studio 2015开发了GitHub插件,然而由于该插件中存在Bug,导致一位用户在短短几小时内就损失了6500美元。这一事件刚发生不久。今天小编给大家带来微软vs2015gitHub插件bug解决方法及微软vs2015gitHub插件更新下载,为了大家使用安全,用户们请及时更新! 事情的始末是这样的:从去年开始,黑客们就开始借助机器人程序24小时扫描GitHub,企图窃取用户不小心公开在GitHub中的亚马逊AWS API key,然后利用窃取到的AWS API key租赁服务器用于挖比特币。由于Visual Studio 2015的GitHub插件存在一处Bug,导致这位用户本想提交到私有仓库的代码被推送到了公有库,结果AWS key被暴露。不幸的是,在意识到问题之前,AWS key已被某比特币矿主爬到,结果导致该用户在几小时内损失了6500美元。事发后, 微软与GitHub积极联系了这位用户,目前已经提供了修复更新。假如你正在使用这款插件,请及时更新。Visual Studio 2015 GitHub插件更新:(点此下载)。