【问题标题】:Explicit Instantiation of Template模板的显式实例化
【发布时间】:2015-09-22 02:38:48
【问题描述】:

This thread 确实很有帮助,但我仍然有关于这个过程的问题似乎没有得到解答。

我必须在多大程度上显式实例化模板?例如,如果在我的定义文件中,我在每个函数、友元类、运算符重载等上都使用模板,我是否必须在模板实例化文件中实例化每个模板(我正在使用的当前方法)?

根据我的反复试验,答案似乎是否定的,而且很简单

template class Class<type>;

适用于班级的所有成员。但是,我已经阅读了其他建议的代码,我们将不胜感激。

【问题讨论】:

  • 您可能会发现this post 很有帮助。
  • 根据@DietmarKühl 的出色帖子,“显式实例化类模板会实例化当前已知定义的所有成员函数。要显式实例化非成员函数模板,必须单独列出每个模板。为了避免要列出每种类型的所有函数,可以创建一个显式引用它们的辅助函数或类模板:显式实例化此模板会隐式实例化所有非成员函数。”这完美地回答了我的问题。干杯

标签: c++ templates


【解决方案1】:

一般来说,您不需要显式实例化模板,只需在头文件中定义它并包含该头文件即可。但是,显式模板实例化的一个常见应用是当您想要“隐藏”模板的定义时。想象以下情况,为简单起见,我们隐藏了模板函数的实现:

header.h

template<class X> void f(); // declaration

header.cpp

#include "header.h"

template<class X> void f(){ /* definition */ }
template void f<int>();    // explicit instantiation for int, force the compiler to generate code
template void f<double>(); // explicit instantiation for double, same

main.cpp

#include "header.h"

int main()
{
    f<int>(); // OK
    f<double>(); // also OK
    f<char>(); // linker error
}

如您所见,函数f 定义在header.cpp 文件中(而notheader.h 中),因此对用户隐藏了实现。由于intdouble 的显式实例化,编译器在编译main.cpp 时将能够找到f&lt;int&gt;()f&lt;double&gt;(); 的代码。但是,在编译main.cpp 时尝试查找f&lt;char&gt;(); 的代码时,会出现链接器错误。那是因为编译是独立完成的,当编译器编译header.cpp时,编译器只生成f&lt;int&gt;f&lt;double&gt;的代码,不知道我们会调用f&lt;char&gt;所以它不会为@生成代码987654338@。

唯一的问题是,为了利用这种代码隐藏,我们必须为我们想要使用它的所有类型显式实例化该函数,否则会出现链接器错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 2021-05-02
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    相关资源
    最近更新 更多