< 返回技术文档列表

有哪些C++模板坑

发布时间:2021-11-07 00:18:45⊙投诉举报

这篇文章主要介绍“有哪些C++模板坑”,在日常操作中,相信很多人在有哪些C++模板坑问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有哪些C++模板坑”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

问题复现

头文件声明:

// 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);     }(); } #endif

2.第二种:分离开+引入头文件

采用头文件声明,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; }

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

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


/template/Home/Zkeys/PC/Static