我在头文件中声明了一个函数模板。这个函数是一个归档器,它应该支持通过项目实现的其他几种类型(类)。这个想法是有一个基本模板声明,然后每个类都专门针对自己的类型。
// 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++ 的原因。我还为 gcc 提供了以下编译器标志:
-std=gnu++11 -fexceptions -fpermissive -lstdc++
-fpermissive
是一种绝望的行为。