日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++模板的特例化编译为多重定义问题

發布時間:2025/5/22 c/c++ 174 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++模板的特例化编译为多重定义问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? 之前遇到了一些關于模板特例化的問題,自己總結一下。

????模板的特例化是C++新標準的一個特點,可以自定義某些模板的實現,比如在比較函數compare可以使用less<T>標準庫模板比較string、int、char、指針等類型,但如果有const char*類型且比較字符串的字典大小時,就與之前的比較方式不同了:

#ifndef?A_H #define?A_H#include?<iostream> #include?<cstring> using?std::less; template?<typename?T> int?compare(const?T?v1,const?T?v2)? {if?(less<T>()(v1,v2))?{return?-1;}else?if?(less<T>()(v2,v1)){return?1;}else{return?0;} }template?<> inline?int?compare(const?char?*const?a,const?char?*const?b)? {return?strcmp(a,b); }#endif?#include?"a.h" using?std::cout; using?std::endl;int?main() {cout?<<?compare(1,2)?<<?endl;??cout?<<?compare("123","asd")?<<?endl;??return?0; }

????現在看上去沒什么問題,并且只有這兩個文件編譯通過且正常運行,如果多了一個包含a.h的文件a.cpp:

#include?"a.h"

????這里只有一句,但包含了a.h文件表示將其模板函數的定義包含,且特例化的函數類似一個普通函數,則a.cpp、main.cpp包含多個相同函數的定義,因此在鏈接時有重定義問題。

????解決方法:

????使用內聯inline聲明特例化的模板,則某些函數的定義可以在多個文件包含(一些函數的實現可能不支持內聯):?

template?<> inline?int?compare(const?char?*a,const?char?*b)? {return?strcmp(a,b); }

????另外一個是使用一個文件包含該頭文件,讓所有鏈接的文件只有一個特例化定義

????第三個是定義普通同名函數,通過重載調用非模板函數(在參數匹配級別相同時,非模板重載函數優先調用)

//?a.h #ifndef?A_H #define?A_H#include?<iostream> #include?<cstring> using?std::less; template?<typename?T> int?compare(const?T?v1,const?T?v2) {if?(less<T>()(v1,v2)){return?-1;}else?if?(less<T>()(v2,v1)){return?1;}else{return?0;} }int?compare(const?char?*a,const?char?*b)?;//?a.cpp #include?"a.h"int?compare(const?char?*a,?const?char?*b) {std::cout?<<?"const?char*"<<std::endl;return?strcmp(a,b); } //?main.cpp?相同

????如果有其他的方法請大家一起交流

轉載于:https://blog.51cto.com/zmh009/1883801

總結

以上是生活随笔為你收集整理的C++模板的特例化编译为多重定义问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。