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

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

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

  • 使两个模板 header (带有 header 保护)一个带有定义,一个不带定义。

  • 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/

    10-10 15:32