在另一个 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>
留给了链接器。
我看到两个选项,但我不知道它们是否有效:
- 制作两个模板 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 文件。有没有更好的方法来获得这种效果?
- 使用派生的模板 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>;
我有一个模板 "collection" class。我不想在每个源文件中重新编译代码。但是这个 collection 应该与未在模板 class 定义中定义的 DataTypes (class SpecialDataMember : DataMember
) 一起使用。
这就是为什么我不能在模板源文件中强制实例化(通过将定义移动到源文件并添加 template LinkCollection<DataMember>;
),因为模板的定义必须可以在其他源文件中访问(“SpecialDataMember.cpp
").
是否可以让“SpecialDataMember.o
”保留 LinkCollection<SpecialDataMember>
的代码。 SpecialDataMember.h
的每个包含者都应该知道我将 LinkCollection<SpecialDataMember>
留给了链接器。
我看到两个选项,但我不知道它们是否有效:
- 制作两个模板 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 文件。有没有更好的方法来获得这种效果?
- 使用派生的模板 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 ofSpecialDataMember.h
should know I leaveLinkCollection<SpecialDataMember>
to the linker.
简单,只需输入:
extern template class LinkCollection<SpecialDataMember>;
在 header 中,它告诉编译器不要实例化该模板并将其留给另一个文件。
然后在一个 SpecialDataMember.cpp
文件中提供实例化:
template class LinkCollection<SpecialDataMember>;