c++ - 完全特化的模板功能

标签 c++ templates gcc template-instantiation

我在头文件中声明了一个函数模板。这个函数是一个归档器,它应该支持通过项目实现的几种其他类型(类)。这个想法是有一个基本模板声明,然后每个类专门针对自己的类型。

// 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 .我也尝试过其他组合:

  1. 直接在头文件中实现,通常推荐用于模板:我得到“多重定义”
  2. 在 .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/

相关文章:

c++ - 从 `<<` 返回 `operator<<` 的结果

c++ - 为什么程序在仅加入 1 个线程但有 5 个线程时可以正常工作

c++ - 如何关闭一段 Lua 代码

c++ - SIMD 指令缺少 OpenMP if 子句

c++ - 如何编译非类型模板参数?

c++ - 如何在C++中使用模板对象的模板成员函数创建线程

c++ - 如何将 C++ 指针传递给 Fortran?

linux - memcpy memmove GLIBC_2.14/2.2.5的解释

c - 使用带有 clang 的 c11 标准来使用 strcpy_s

DEV-C++ 中的编译器错误