您好,登錄后才能下訂單哦!
這篇文章主要介紹“有哪些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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。