1. 程式人生 > >關於模版函式的全特化

關於模版函式的全特化

在類中有一個模版函式,只有一個引數型別,對其進行特化時遇到了一點小麻煩,為了能夠幫助更多人解決問題以及作為自己的學習筆記,把解決的整個過程記錄下來。


  object.h

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中實現全特化模版函式,也有一定的道理,它與編譯器最後根據使用者程式碼生成的函式是一致的,而這種函式不可能在標頭檔案中,如果在標頭檔案中,勢必出現重複定義的錯誤。