我有一个模板化的“收藏”类。我不希望代码在每个源文件中都重新编译。但是,此集合应与未在模板类的定义中定义的DataTypes(class SpecialDataMember : DataMember
)一起使用。
这就是为什么我不能在模板源文件中强制实例化(通过将定义移至源文件并添加template LinkCollection<DataMember>;
)的原因,因为模板的定义必须在其他源文件(“SpecialDataMember.cpp
”)中可以访问。
是否可以使“SpecialDataMember.o
”保存LinkCollection<SpecialDataMember>
的代码。每个SpecialDataMember.h
的包含者都应该知道我将LinkCollection<SpecialDataMember>
留给了链接程序。
我看到两个选项,但不知道它们是否有效:
SpecialDataMember.h
// ..
include "LinkCollection.h"
// ..
SpecialDataMember.cpp
// ..
include "LinkCollectionImpl.h"
// ..
include "SpecialDataMember.h"
// ..
template LinkCollection<SpecialDataMember>;
所有“
SpecialDataMember.h
”的包含者都不知道模板的定义,因此他们将让链接器完成其工作。并且链接器将在LinkCollection<SpecialDataMember>
中查找SpecialDataMember.o
的实例化。那是对的吗?但是我必须维护两个头文件。有没有更好的方法来获得这种效果?
如果我在“
class SpecialDataMemberLinkCollection : LinkCollection<SpecialDataMemberLink>
”头文件和源文件中创建一个特殊的SpecialDataMember
,则可以改为引用该特殊类,因此编译器知道该类和基类模板的实例化,并将工作留给链接器。会按预期工作吗? 最佳答案
简单,只需输入:
extern template class LinkCollection<SpecialDataMember>;
在 header 中,告诉编译器不要实例化该模板并将其留给另一个文件。
然后在一个
SpecialDataMember.cpp
文件中提供该实例化:template class LinkCollection<SpecialDataMember>;
关于c++ - 在另一个标题中强制模板实例化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32209824/