日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C++模板坑,一起來issue

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

創(chuàng)新互聯(lián)是一家專業(yè)提供開魯企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計、成都h5網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為開魯眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。

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

問題復(fù)現(xiàn)

頭文件聲明:

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

頭文件實現(xiàn):

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

報錯:

 
 
 
  1. undefined reference to.... 

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

1.第一種:同一文件

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

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

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

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

例如:

頭文件實現(xiàn):

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

實現(xiàn):

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

3.在末尾引入cpp

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

頭文件只需要聲明:

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

頭文件定義即可:

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

調(diào)用處正常調(diào)用:

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

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

4.總結(jié)

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


文章標題:C++模板坑,一起來issue
轉(zhuǎn)載源于:http://www.dlmjj.cn/article/djicjoe.html