我有一个头文件中声明的函数模板。该功能是一个归档器,应该支持通过该项目实施的其他几种类型(类)。这个想法是有一个基本的模板声明,每个类然后专门针对它自己的类型。完全专业化的模板功能
// 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 /接口) 。这就是我会用的。 –