网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

有哪些C++模板坑

这篇文章主要介绍“有哪些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"   template  void 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::vector v{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"  template  void TestTemp(const Vec &v, T target) {     [=]() {         for (auto elem : v)             if (elem == target)                 PRINTFMT(elem);     }(); }

调用处正常调用:

#include "temp.h"  int main() {     std::vector v{1,2,3};     int target = 2;     TestTemp(v,target);      return 0; }

在一些开源项目中,这种方式比较常见,只不过这里的.cpp得改为.hpp。其余不变!

到此,关于“有哪些C++模板坑”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


本文标题:有哪些C++模板坑
URL网址:http://bjjierui.cn/article/ghocpd.html

其他资讯