中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

有哪些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

个旧市| 三都| 扎鲁特旗| 博罗县| 平顺县| 吉木乃县| 石河子市| 墨脱县| 金堂县| 临泽县| 新田县| 阜阳市| 都安| 宣恩县| 永吉县| 阿合奇县| 枞阳县| 云阳县| 喀什市| 哈尔滨市| 达州市| 邯郸市| 嘉义县| 新源县| 格尔木市| 镶黄旗| 阜新市| 虎林市| 吴川市| 潜江市| 临江市| 肃宁县| 买车| 香港| 安康市| 高台县| 济源市| 巴彦淖尔市| 博客| 民权县| 离岛区|