在另一个 header 中强制模板实例化

Force template instantiation in another header

我有一个模板 "collection" class。我不想在每个源文件中重新编译代码。但是这个 collection 应该与未在模板 class 定义中定义的 DataTypes (class SpecialDataMember : DataMember) 一起使用。 这就是为什么我不能在模板源文件中强制实例化(通过将定义移动到源文件并添加 template LinkCollection<DataMember>;),因为模板的定义必须可以在其他源文件中访问(“SpecialDataMember.cpp").

是否可以让“SpecialDataMember.o”保留 LinkCollection<SpecialDataMember> 的代码。 SpecialDataMember.h 的每个包含者都应该知道我将 LinkCollection<SpecialDataMember> 留给了链接器。

我看到两个选项,但我不知道它们是否有效:

  1. 制作两个模板 headers(带有 header 守卫)一个有定义,一个没有定义。

SpecialDataMember.h

// ..
include "LinkCollection.h"
// ..

SpecialDataMember.cpp

// .. 
include "LinkCollectionImpl.h"
// .. 
include "SpecialDataMember.h"
// .. 
template LinkCollection<SpecialDataMember>;

SpecialDataMember.h”的所有包含程序都不知道模板的定义,因此它们会让链接器执行他的 work.And 链接器会在 LinkCollection<SpecialDataMember> 中找到 LinkCollection<SpecialDataMember> 的实例化=16=]。那是对的吗? 但是我必须维护两个 header 文件。有没有更好的方法来获得这种效果?

  1. 使用派生的模板 classes

如果我在“SpecialDataMember”header 和源文件中创建一个特殊的 class SpecialDataMemberLinkCollection : LinkCollection<SpecialDataMemberLink>,我可以引用这个特殊的 class,这样编译器就知道了是 class 和基础 class 模板的实例化,并将工作留给链接器。这会按预期工作吗?

Is it possible to make "SpecialDataMember.o" hold the code for LinkCollection<SpecialDataMember>. Every includer of SpecialDataMember.h should know I leave LinkCollection<SpecialDataMember> to the linker.

简单,只需输入:

extern template class LinkCollection<SpecialDataMember>;

在 header 中,它告诉编译器不要实例化该模板并将其留给另一个文件。

然后在一个 SpecialDataMember.cpp 文件中提供实例化:

template class LinkCollection<SpecialDataMember>;