我在头文件中声明了一个函数模板。这个函数是一个归档器,它应该支持通过项目实现的几种其他类型(类)。这个想法是有一个基本模板声明,然后每个类专门针对自己的类型。
// 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 文件中执行,但没有在 header 上声明:我得到
undefined reference
从另一个编译单元调用方法时
那么实现这个的正确之处是什么?
编辑:
最初我决定使用模板是因为逆过程,取消归档。基本上我可以写 unarchive<Header>()
而不是 unarchive_header()
这似乎更合适。
我相信我还应该提到我正在使用 Android Studio 和 Gradle 构建系统编译它,这就是我使用 gcc 而不是 g++ 的原因。我还为 gcc 提供了以下编译器标志:
-std=gnu++11 -fexceptions -fpermissive -lstdc++
-fpermissive
是一种绝望的行为。
最佳答案
只是不要使用模板:
// Header.h
void archive(Archiver & archiver, const Header & obj);
和
// Header.cpp
void archive(Archiver & archiver, const Header & obj)
{
// Code here
}
这样就简单多了。只需对 archive()
进行非限定调用,并确保在与 Header
相同的命名空间中声明此重载,然后让 ADL 发挥其魔力。
关于c++ - 完全特化的模板功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33266353/