189 8069 5689

有哪些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++模板坑
网页路径:http://cdxtjz.cn/article/ghocpd.html

其他资讯