问题标签 [explicit-instantiation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
24 浏览

c++ - 为许多数据类型显式实例化模板类的最有效方法是什么?

假设我有一个头文件如下:

我想显式地实例化这个类及其所有使用 int、float 和 double 类型的方法。我必须手动输入每个实例化还是有更好的方法来做到这一点?

0 投票
2 回答
117 浏览

c++ - 在可变参数模板实例化期间函数不可见

我正在尝试创建一个函数,该函数返回数组数组的零填充数组...在我定义的现代 C++ 中优雅地定义多维数组之后

然后我定义以下模板函数来填充零:

例如,当我这样做时

它编译得很好。如果我尝试这样做:

我在编译时收到以下错误:

我真的不明白this candidate was rejected because function is not visible在告诉我什么。我想我不明白为什么它不可见?任何帮助表示赞赏。

0 投票
2 回答
332 浏览

c++ - 受约束的成员函数和显式模板实例化

G++ 和 Clang++ 同意以下代码段不是有效的 C++:

错误消息指出,即使是具有未满足约束的函数也会被实例化:

我可以通过多种方式使其工作(例如,声明Dot为具有等于rank应用约束的默认参数的模板),但我希望它能够工作。

一般来说,我是否应该假设不能显式实例化具有取决于其模板参数的约束的成员函数的模板类?

0 投票
1 回答
52 浏览

c++ - 何时在类模板中实例化函数模板?

以下类模板中的函数模板在哪一刻被实例化?

在自由函数模板中,模板在使用具体类型或显式实例化调用时被实例化。

类模板是什么情况?我猜func2() - func4()是用显式类模板实例化来实例化的template class A<int>;。或者在第一个函数调用的时刻进行实例化,例如a1.func2(2.)

如果func1()实例化可能发生在调用的情况下,a1.func1<double>(1.);因为这是第一次T2知道第二个模板参数?

关于次要问题:我写A或写有关系A<T>吗?我认为这是相同的,但我不确定。

0 投票
1 回答
70 浏览

c++ - 显式实例化模板的静态成员和另一个静态变量的初始化顺序

这是我的问题的简化形式(基于一个真实的库):

我的问题是,在这种情况下(单个翻译单元)是否可以保证——按照定义和实例化的顺序——在函数被调用X<int>::v_之前被初始化。init()


AFAIK,静态变量按其定义的顺序在单个翻译单元中初始化,但是模板和显式实例化可以改变它吗?如果那个显式实例化被移除了怎么办?或者,放在源代码的末尾?

0 投票
1 回答
36 浏览

c++ - 模板显式实例化如何工作?

我正在努力理解使用extern说明符的模板显式实例化。这是我的例子”

// 电源.h

// 电源.cpp

//mathlib.h

// 数学库.cpp

//physiqlib.h

//physiqlib.cpp

//main.cpp

  • 当我编译程序时,它可以正常工作并给我正确的结果但是我想知道这是否Explicit instantiation有效?

  • 我很抱歉写了我的整个程序,但我只是想展示我是如何使用它的。

  • 为了简洁起见,我还举了一个任意的例子,并从标题中删除了包含保护。

  • 请指导我是否走在正确的道路上,特别是我在论坛上进行了搜索,我仍然有点困惑。

** 如果我从生成中间文件的终端编译程序:g++ -S -save-temps main.cpp physiqlib.cpp power.cpp mathlib.cpp 为什么我会在每个*.ii模板类中得到一个定义Power?像这样的东西:

// 数学库.ii

  • 这是否意味着类模板Power仅被定义但尚未实例化并且实例化class Power<int>在其他地方?

  • 如果我是正确的,新标准是否可以使用这种技术来避免模板代码膨胀?

太感谢了!

0 投票
1 回答
97 浏览

c++ - 显式实例化模板类的显式实例化模板方法

我有一个带有模板参数 T 的类 A,它仅限于两种类型:T1 和 T2。因此,我为类型 T1 和 T2 显式实例化了类 A,这样 A 的功能可以在源文件中定义,并且不需要在每次包含 A.hpp 时都重新编译。

A.hpp:

A.cpp:

但是,现在我想向 A<T1> 和 A<T2> 添加一个模板化方法,其中模板参数再次被限制为两种类型:S1 和 S2:

A.hpp:

A.cpp:

如何为 (T, S) = {T1, T2} x {S1, S2} 显式实例化 A<T>::advancedMethod<S>?根据我在网上找到的内容,我尝试将这样的内容添加到 A.hpp 的末尾:

但是,这根本不起作用。

0 投票
1 回答
63 浏览

c++ - 完美转发无法与显式模板实例化指令(EIDir;又名手动实例化)链接

问题是,当构造函数定义隐藏在实现文件 (*.cpp) 中但在主文件中显式实例化时,为什么链接器(g++,版本 7.5,Ubuntu 18.4)无法完善转发模板类的构造函数。 cp?

具体来说: fwd_machine.hpp:

其中launch()函数模板运行一个通用仿函数,通过 r 值获取可变参数 args,以便可以转发它们。在这种情况下some_type(通过制作unique_ptr它)的构造函数。

但是,我需要隐藏在实现文件中的构造函数定义: fwd_machine.cpp:

然后主要是对整个类使用手动实例化: main_fwd_issues.cpp:

但是,如前所述,我收到链接器错误:undefined reference to `some_type<int>::some_type(int, void*)'

我发现的唯一解决方案是使用自动模板实例化(即,在标头中提供构造函数的定义);或者,使用显式特化(在头文件中定义一个不被调用的通用构造函数,并<int>在实现文件中特化)。launch()我尝试过的其他任何事情(限定构造函数的签名;没有在or中使用完美转发factory_t::operator())都失败了。

我想了解为什么链接器无法使用 的手动实例化some_type,以及是否仍有可能使用手动实例化的方法(并避免专门化)。

0 投票
1 回答
126 浏览

c++ - Clang++ 使链接器在模板类上失败(但它适用于 g++)

我有一个与 GCC 配合得很好的程序,但是用 Clang 编译它会使链接器失败。

我认为我的问题是模板类,所以我实现了这个小例子。

test.cpp

Point.h

Point.cpp

当我用 构建它时g++ Point.cpp test.cpp,它可以正常工作。

但是对于 Clang,它会给出以下错误:

或者,使用 lld:

我想我的显式实例化Point.h对于 Clang 来说还不够好,但我不知道它想要什么。

0 投票
1 回答
79 浏览

c++ - 带有别名有效负载的外部模板声明

考虑一下。有一个类Derived继承自重模板类的一些实例化,并且在各种源文件中Base有很多用途。Derived因此,只有一个Derived的特定实例化是合理的Base

C++11 允许这个 via extern template,但这里的问题是我只想键入一次的Derived-specific 实例化Base。从技术上讲这是可能的,因为Derived可以为该实例化一个别名,但问题是:它仍然会强制编译器不实例化模板吗?

这是尝试:

这里的重点是强制Use01.cpp不实例化,而是Base<int>引用显式实例化。Derived.cpp

我正在编译,gcc-v9.3问题是:

  1. 声明是否extern template对翻译单元中的所有实例生效,还是仅对出现其声明之后的实例生效?
  2. 使用Derived::TheArg而不是int延迟实例化会导致任何问题吗?

extern template声明放在末尾Use01.cpp并注释掉显式实例化Derived.cpp会使编译失败,所以这让我相信extern template声明不必出现在任何实例化之前,所以第二个问题仍然有意义。