我有這樣的代碼:爲什麼在頭文件結構中聲明的模板不會違反ODR和專業化?
#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,爲什麼不會發生?
任何與模板參數本質上是隱式的「內聯」。 – aschepler
模板專業化是一種功能。該模板是一個模板。模板不是功能,反之亦然。模板遵循不同的規則。 –
@KerrekSB,實際上幫助很多,謝謝。我在試圖理解爲什麼我只需要專業化的問題。我想象這是適用於您聲明朋友操作符時的相同規則,並且您需要使用內聯以防止ODR上的違規行爲,對嗎? – Lefsler