[英]Why templates declared in the struct on the header dont violate ODR and specialization does?
我有這個代碼:
#include <iostream>
struct A
{
template<typename T> bool isImplemented()
{
std::cout << "Not Implemented" << std::endl;
return false;
}
};
template<> inline bool A::isImplemented<int>()
{
std::cout << "int Implemented" << std::endl;
return true;
}
我可以理解為什么模板專門化需要內聯,為了防止ODR被違反,內聯將合並轉換表避免沖突。
但是,為什么我不需要在結構A中的isImplemented上內聯? 也許這個問題可以擴展到,為什么如果方法在頭部的struct / class中聲明它不需要內聯? 據我所知,它會在每個被調用的目標文件(.o)上創建符號,違反ODR,為什么不會發生?
您不需要它有兩個原因:
inline
。 inline
關鍵字。 請記住,您的原始功能是模板,而專業化則不是。 這里要強調的是template<typename T> bool isImplemented()
不是函數 。 它是一個函數的模板,一旦專門化就會存在(作為代碼),就像你使用template<> inline bool A::isImplemented<int>()
。
這里的inline
不是強制性的。 程序編譯並在沒有它的情況下完美運行。
奇怪的是你的struct A
不依賴於任何模板參數既不是isImplemented()
方法,所以我仍然試圖找出你的意圖。
函數的簡單用法可能如下所示:
int main( )
{
A a;
a.isImplemented< int >( );
a.isImplemented< double >( );
}
並輸出:
int Implemented
Not Implemented
基本上你可以告訴你從通用的那些明確實現的專業化。 這是你需要的嗎?
編輯:
鑒於對我的回答的評論,我相信原來的問題在這里很好地回答:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.