这篇文章主要介绍“有哪些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++模板坑”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。