關於模版函式的全特化
阿新 • • 發佈:2018-12-31
在類中有一個模版函式,只有一個引數型別,對其進行特化時遇到了一點小麻煩,為了能夠幫助更多人解決問題以及作為自己的學習筆記,把解決的整個過程記錄下來。
class CObject
{
public:
template <class T>
int func()
{
return sizeof(T);
}
//假設對於int型別func函式要返回常數100
template <>
int func<int>()
{
return 100;
}
};
上述程式碼中g++中編譯會有錯誤,提示特化函式定義的域有問題,不知道g++如何考慮,為什麼不允許這樣做!
在網上搜索了一下,有些人這樣解決:
class CObject
{
public:
template <class T>
int func()
{
return sizeof(T);
}
};
//假設對於int型別func函式要返回常數100
template <>
int func<int>()
{
return 100;
}
確實編譯通過了,但,如果該標頭檔案在多個cpp檔案中引用後,會發生連結時錯誤,該函式重複定義。
經過一翻考慮,試著將特化的函式放在了object.cpp檔案中,在標頭檔案中只保留原始的模版函式宣告和其實現:
object.h
class CObject
{
public:
template <class T>
int func()
{
return sizeof(T);
}
};
object.cpp
//假設對於int型別func函式要返回常數100
template <>
int func<int>()
{
return 100;
}
再編譯和連結,問題就完全解決了。
總結,我理解,對於模版函式的全特化,既有普通函式的特點,又有模版的特性,是一個模版派生出來的普通函式,又要依據模版匹配而匹配全特化模版函式。所以,放在cpp中實現全特化模版函式,也有一定的道理,它與編譯器最後根據使用者程式碼生成的函式是一致的,而這種函式不可能在標頭檔案中,如果在標頭檔案中,勢必出現重複定義的錯誤。