91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

有哪些C++模板坑

發布時間:2021-11-01 17:19:04 來源:億速云 閱讀:121 作者:iii 欄目:編程語言

這篇文章主要介紹“有哪些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++模板坑”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

织金县| 孟州市| 临夏县| 遵义县| 宁德市| 江城| 五峰| 电白县| 璧山县| 定边县| 梅州市| 武冈市| 博乐市| 多伦县| 鄢陵县| 江油市| 沂南县| 张家口市| 五家渠市| 晋宁县| 德州市| 贺兰县| 独山县| 晋中市| 宜阳县| 平陆县| 增城市| 读书| 金门县| 仁寿县| 巨鹿县| 洛阳市| 民丰县| 隆昌县| 祁东县| 东明县| 铜梁县| 阳信县| 湖州市| 绥棱县| 阿鲁科尔沁旗|