我有一個頭文件中聲明的函數模板。該功能是一個歸檔器,應該支持通過該項目實施的其他幾種類型(類)。這個想法是有一個基本的模板聲明,每個類然後專門針對它自己的類型。完全專業化的模板功能
// Archiver.h
template <class T> void archive(Archiver & archiver, const T & obj);
該方法沒有實現。現在我創建一個類(例如,Header
),我希望它可以存檔。因此,我的意圖是專門化該方法。這是我現在有:
// Header.h
extern template void archive(Archiver & archiver, const Header & obj);
我宣佈的功能extern
因爲我在.cpp文件
// Header.cpp
template <> void archive(Archiver & archiver, const Header & obj)
{
// Code here
}
這給specialization after instantiation
實現它。我試過其他的組合,以及:
- 在頭文件中直接實現,因爲通常建議模板:我得到「多重定義」在.cpp文件
- 實施不會對頭部的聲明:當從另一個編譯單元調用該方法時,我得到
undefined reference
那麼實現這個的正確性是什麼?
編輯:
起初,我決定去,因爲逆過程的模板,解除存檔。基本上我可以寫unarchive<Header>()
而不是unarchive_header()
這似乎更合適。
我相信我也應該提一下,我正在編譯使用Android Studio和Gradle構建系統,這就是爲什麼我使用gcc而不是g ++。我也給海灣合作委員會下列編譯器選項:
-std=gnu++11 -fexceptions -fpermissive -lstdc++
-fpermissive
是一種絕望的行爲。
爲什麼不使用單獨的函數? – melpomene
除非你有一個非常好的理由將歸檔作爲一個單獨的函數,否則我建議用其他方法來完成:使用你想要實現的類的虛擬方法(以及可以實現的所有類的ABC /接口) 。這就是我會用的。 –