成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++模板坑,一起來issue

開發 后端
C++開發中通常將類定義放在C ++頭文件(.h)中,并將實現放在C ++源文件(.cpp)中。然后,將源文件作為項目的一部分,這意味著將其單獨編譯。但是,當我們對模板類實施此過程時,將出現一些編譯和鏈接問題。本文闡述了三種可能的解決方案,幫助大家可以在實現該模板的源文件中創建一個模板類的對象,解決上述問題。

[[329857]]

C++開發中通常將類定義放在C ++頭文件(.h)中,并將實現放在C ++源文件(.cpp)中。然后,將源文件作為項目的一部分,這意味著將其單獨編譯。但是,當我們對模板類實施此過程時,將出現一些編譯和鏈接問題。

本文闡述了三種可能的解決方案,幫助大家可以在實現該模板的源文件中創建一個模板類的對象,解決上述問題。

問題復現

頭文件聲明:

 

  1. // temp.h 
  2. #ifndef _TEMP_H_ 
  3. #define _TEMP_H_ 
  4. #include <iostream> 
  5. #include <vector> 
  6. template <typename T> 
  7. using Vec = std::vector<T>; 
  8. #define PRINTFMT(x) std::cout << x << " "
  9.  
  10. template <typename T> 
  11. void TestTemp(const Vec<T> &v, T target); 
  12. #endif 

頭文件實現:

 

  1. #include "temp.h" 
  2.  
  3.  
  4. template <typename T> 
  5. void TestTemp(const Vec<T> &v, T target) 
  6.     [=]() { 
  7.         for (auto elem : v) 
  8.             if (elem == target) 
  9.                 PRINTFMT(elem); 
  10.     }(); 

報錯:

 

  1. undefined reference to.... 

問題描述:當在.h中聲明了模板,.cpp中定義了模板,當main函數去進行模板實例化的時候,在聲明處找不到對應的T類型,自然就出問題了。

1.第一種:同一文件

聲明及定義都在.h文件中。

 

  1. // temp.h 
  2. #ifndef _TEMP_H_ 
  3. #define _TEMP_H_ 
  4. #include <iostream> 
  5. #include <vector> 
  6. template <typename T> 
  7. using Vec = std::vector<T>; 
  8. #define PRINTFMT(x) std::cout << x << " "
  9.  
  10. template <typename T> 
  11. void TestTemp(const Vec<T> &v, T target) 
  12.     [=]() { 
  13.         for (auto elem : v) 
  14.             if (elem == target) 
  15.                 PRINTFMT(elem); 
  16.     }(); 
  17. #endif 

2.第二種:分離開+引入頭文件

采用頭文件聲明,cpp定義,要想起作用,得在使用處引入兩者并且定義處得用特化版本。

例如:

頭文件實現:

 

  1. // Temp.cpp 
  2. #include "temp.h" 
  3.  
  4. void TestTemp(const Vec<int> &v, int target) 
  5.     [=]() { 
  6.         for (auto elem : v) 
  7.             if (elem == target) 
  8.                 PRINTFMT(elem); 
  9.     }(); 
  10.  
  11. template <typename T> 
  12. void TestTemp(const Vec<T> &v, T target) 
  13.     [=]() { 
  14.         for (auto elem : v) 
  15.             if (elem == target) 
  16.                 PRINTFMT(elem); 
  17.     }(); 

實現:

 

  1. #include "temp.h" 
  2. #include "temp.cpp" 
  3.  
  4. int main() { 
  5.     std::vector<int> v{1,2,3}; 
  6.     int target = 2; 
  7.     TestTemp<int>(v,target); 
  8.  
  9.     return 0; 

3.在末尾引入cpp

只需要在.h頭文件末尾引入cpp即可。

頭文件只需要聲明:

 

  1. // temp.h 
  2. #ifndef _TEMP_H_ 
  3. #define _TEMP_H_ 
  4. #include <iostream> 
  5. #include <vector> 
  6. template <typename T> 
  7. using Vec = std::vector<T>; 
  8. #define PRINTFMT(x) std::cout << x << " "
  9.  
  10. template <typename T> 
  11. void TestTemp(const Vec<T> &v, T target); 
  12. #include "temp.cpp" 
  13. #endif 

頭文件定義即可:

 

  1. // Temp.cpp 
  2. #include "temp.h" 
  3.  
  4. template <typename T> 
  5. void TestTemp(const Vec<T> &v, T target) 
  6.     [=]() { 
  7.         for (auto elem : v) 
  8.             if (elem == target) 
  9.                 PRINTFMT(elem); 
  10.     }(); 

調用處正常調用:

 

  1. #include "temp.h" 
  2.  
  3. int main() { 
  4.     std::vector<int> v{1,2,3}; 
  5.     int target = 2; 
  6.     TestTemp<int>(v,target); 
  7.  
  8.     return 0; 

在一些開源項目中,這種方式比較常見,只不過這里的.cpp得改為.hpp。其余不變!

4.總結

本節針對日常代碼中的難點進行了梳理,提出了幾種解決方案。可以簡單的把模板理解為一種特殊的宏,模板類不要當作類,在被實例化的時候一定得找到定義,不然只看到聲明,就GG了。

責任編輯:龐桂玉 來源: C語言與C++編程
相關推薦

2012-04-14 20:47:45

Android

2012-06-25 09:37:24

Web

2012-11-08 17:33:53

智慧云

2021-06-09 08:15:50

volatileJava開發

2010-05-21 17:32:07

IIS服務器

2009-10-29 16:32:34

Oracle表空間

2012-09-10 13:42:55

PHP項目管理

2021-06-02 15:30:12

Synchronize并發多線程

2021-04-26 11:18:15

FedoraLinuxBug

2011-09-07 22:59:07

聯想一體機

2022-05-20 12:14:50

ZuulSpringClou

2010-05-10 15:31:35

Unix文件

2009-07-14 16:35:57

Swing組件大全

2012-07-10 09:14:51

Web

2017-11-02 15:28:52

2017-11-02 14:39:54

2021-07-28 14:15:51

漏洞懸賞平臺漏洞谷歌

2009-09-09 09:23:37

服務器穩定性

2021-01-20 15:31:00

區塊鏈比特幣數字貨幣
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线欧美日韩 | 在线观看免费av网 | 亚洲欧美日本在线 | 一区二区三区国产 | 国产一在线 | 草久久 | 国产黄色电影 | 精品国产一二三区 | 久久综合香蕉 | 蜜桃在线一区二区三区 | 97中文视频 | 日韩精品在线一区 | 日韩高清国产一区在线 | 日本一道本 | 亚洲午夜精品视频 | 午夜三级视频 | 国产精品日韩 | 手机看黄av免费网址 | 亚洲一区电影 | 免费在线毛片 | 亚洲网站观看 | 日本三级视频 | 国产欧美精品 | 久久精品欧美一区二区三区不卡 | 中文字幕av一区 | 免费一区 | 一区二区三区四区在线 | 在线91 | 凹凸日日摸日日碰夜夜 | 亚洲一区 | 爱爱小视频 | 亚洲一二三在线观看 | 天天干狠狠干 | 中文字幕一区二区三区四区 | 久久久精品一区二区 | 国产一级片一区二区三区 | 日本色高清 | 97超碰成人 | 国产视频1区2区 | 精品一二区 | 国产午夜精品一区二区三区四区 |