C++模板的特例化编译为多重定义问题
生活随笔
收集整理的這篇文章主要介紹了
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++模板的特例化编译为多重定义问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript正则表达式
- 下一篇: nginx访问控制:如何通过map来控制