大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍“有哪些C++模板坑”,在日常操作中,相信很多人在有哪些C++模板坑问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有哪些C++模板坑”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
威县网站建设公司创新互联,威县网站设计制作,有大型网站制作公司丰富经验。已为威县上千家提供企业网站建设服务。企业网站搭建\成都外贸网站制作要多少钱,请找那个售后服务好的威县做网站的公司定做!
问题复现
头文件声明:
// temp.h #ifndef _TEMP_H_ #define _TEMP_H_ #include#include template using Vec = std::vector ; #define PRINTFMT(x) std::cout << x << " "; template void TestTemp(const Vec &v, T target); #endif
头文件实现:
#include "temp.h" templatevoid TestTemp(const Vec &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#include template using Vec = std::vector ; #define PRINTFMT(x) std::cout << x << " "; template void TestTemp(const Vec &v, T target) { [=]() { for (auto elem : v) if (elem == target) PRINTFMT(elem); }(); } #endif
2.第二种:分离开+引入头文件
采用头文件声明,cpp定义,要想起作用,得在使用处引入两者并且定义处得用特化版本。
例如:
头文件实现:
// Temp.cpp #include "temp.h" void TestTemp(const Vec&v, int target) { [=]() { for (auto elem : v) if (elem == target) PRINTFMT(elem); }(); } template void TestTemp(const Vec &v, T target) { [=]() { for (auto elem : v) if (elem == target) PRINTFMT(elem); }(); }
实现:
#include "temp.h" #include "temp.cpp" int main() { std::vectorv{1,2,3}; int target = 2; TestTemp (v,target); return 0; }
3.在末尾引入cpp
只需要在.h头文件末尾引入cpp即可。
头文件只需要声明:
// temp.h #ifndef _TEMP_H_ #define _TEMP_H_ #include#include template using Vec = std::vector ; #define PRINTFMT(x) std::cout << x << " "; template void TestTemp(const Vec &v, T target); #include "temp.cpp" #endif
头文件定义即可:
// Temp.cpp #include "temp.h" templatevoid TestTemp(const Vec &v, T target) { [=]() { for (auto elem : v) if (elem == target) PRINTFMT(elem); }(); }
调用处正常调用:
#include "temp.h" int main() { std::vectorv{1,2,3}; int target = 2; TestTemp (v,target); return 0; }
在一些开源项目中,这种方式比较常见,只不过这里的.cpp得改为.hpp。其余不变!
到此,关于“有哪些C++模板坑”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!