问题标签 [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 投票
1 回答
660 浏览

c++ - 为什么我使用模板函数得到“调用'...'没有匹配的函数”?

使用以下代码:

材料.h:

材料.h:

confdef.h:

主文件

这里是重现错误的上述代码的在线版本。)

我在注释行收到以下编译错误消息:

调用“MakeMaterial”没有匹配的函数

我究竟做错了什么?显式实例化不应该允许编译器看到正确的函数吗?

如果我明确地编写代码,代码就会编译MakeMaterial<solid>,但这里的重点是typeConfig参数中推断出来。我怎样才能做到这一点?

0 投票
2 回答
1363 浏览

c++ - 专用模板的多次实例化

我有一个具有特化的显式实例化模板类:

以上文件用g++ 4.9.2编译成静态库:

我希望 a1.o 包含 A<1>::foo(),而 a2.o 包含 A<2>::foo(),但不是相反,因为每个实例中只有一个实例.cc 文件。

然而,事实证明,两个目标文件都包含这两个函数。VS2015RC 还给出了链接器警告:

为什么?

此外,如果我注释掉 N=2 的特化,使用 g++ 它仍然会静默编译,即使显式实例化的 N=2 案例具有未解析的功能......(VS2015RC 警告说“没有为显式模板实例化请求提供合适的定义”,正如预期的那样)。


澄清- 根据标准(14.7.3.6):

如果类模板的 [..] 成员是显式特化的,则应在第一次使用该特化之前声明该特化,这将导致发生隐式实例化,在发生这种使用的每个翻译单元中[.]

这段话(隐含地)指出,需要使用专门化才能对其进行实例化。

我的问题是 A<2>::foo() 在 a1.o 中被隐式实例化,即使在那个翻译单元中没有使用这个规范。

0 投票
1 回答
499 浏览

c++ - 用于模板实例化的 Clang/g++ 选项

我正在寻找 g++/clang++ 上的编译器选项来控制显式实例化中方法的实例化。

假设我有一个Foo<T>带有一些显式实例化的类模板

我想启用所有公共方法的实例化。这似乎不是默认设置,因为我必须为所有成员添加手动实例化以避免链接错误;

0 投票
2 回答
498 浏览

c++ - 模板内静态成员的初始化

这是一个最小的例子:

该程序使用 g++ 4.9.2 写入 42,但使用 Visual Studio 2015 RC 写入 0。另外,如果我取消显式实例化的注释,VS2015RC 也会给出 42,这很有趣,因为这里的模板参数与main函数中使用的不同。

这是一个错误吗?我假设 g++ 是正确的,因为有对binside的引用foo,所以B应该调用构造函数。


编辑:有一个简单的解决方法 - 如果在 中有一个非静态变量B,在 中引用A,VS2015RC 将正确编译:

这似乎有效,尽管b.y作为一个声明,显然是 NOP。

0 投票
2 回答
714 浏览

c++ - 围绕显式模板实例化的困惑

好吧,我想我对显式模板实例化感到非常困惑~>_<~

  1. 显式实例化声明能否利用隐式实例化定义?
  2. 如果程序中同时存在显式和隐式实例化定义怎么办?他们最终会崩溃成一个单一的吗?
  3. 显式实例化声明放在隐式实例化定义之后是否有任何影响?

另外,请参见以下代码:

导致链接错误

使用 GCC 5.2,但使用 clang 3.6 构建良好。根据标准,哪一个是正确的?

我希望有一种有见地的方法来理解显式模板实例化,以便可以从逻辑上推断和解释上述所有问题的答案。

0 投票
1 回答
188 浏览

c++ - Friend declaration and explicit template instantiation declaration

Suppose I have a function template

Then, we could have a friend declaration

and an explicit template instantiation declaration

Are the two declarations related in some way or totally independent? If related, how do they interact with each other?

0 投票
0 回答
108 浏览

c++ - 显式模板实例化定义是否也抑制隐式实例化?

我知道显式实例化声明会抑制隐式实例化。但是如果只有一个明确的实例化定义呢?它是否也抑制了以下隐式实例化?

例如:

显式模板实例化定义是否抑制了随后的隐式实例化?我知道,如果我通过在extern关键字前面加上显式定义将显式定义变为声明,则会抑制隐式实例化。

0 投票
1 回答
745 浏览

c++ - 当显式模板实例化定义在显式声明之前时,GCC 和 clang 不同意

请参阅以下代码:

虽然 GCC 5.2 编译良好,但 clang 3.6 给出以下错误消息:

不过,对于以下代码

GCC 和 clang 都出错了。GCC 的消息是

铿锵的声音是

这两个家伙到底是怎么回事?标准是否禁止显式模板实例化声明前面有显式定义?这对我来说意义不大。毕竟,先定义再声明又有什么坏处呢?想想非模板函数的情况。

0 投票
1 回答
2146 浏览

c++ - 如何导出从 Visual Studio 中显式实例化的模板派生的类?

在我的 DLL 中,我有一个类模板和从该模板的实例派生的第二个类。这两个类都应导出并在其他 DLL 中使用。编译器是 Visual Studio 2013。我希望模板代码在一个翻译单元中被实例化,所以我使用显式实例化。

DLL1 中的代码分布如下。基类模板:

派生类:

理论是extern语句阻止在所有翻译单元中实例化,除了 BaseTemplate.cpp,其中执行显式实例化。但是,我收到以下警告(在我的项目中被视为错误,因此会破坏构建):

似乎派生类的导出触发了实例化,忽略了extern语句。如果我从 Derived 类中删除导出宏,则 DLL1 编译时不会发出警告(但其他 DLL 显然无法链接)。如果我在 Derived 类中聚合 BaseTemplate 类型的成员而不是继承,它也可以正常工作(即使是导出)。

如何在 Visual Studio 中组合显式模板实例化和导出的派生类?

0 投票
1 回答
211 浏览

c++ - C++ 模板显式实例化,模板参数是类模板

尝试显式实例化类时遇到链接器问题。使用 C++11,LLVM 5.1。这是一个最小的工作示例:

声明.h:

A_implementation.h:

显式实例化.cpp:

主.cpp:

这是链接器错误:

看起来编译器将第二个显式实例化视为与 main 的第二个声明不同的东西。我不明白为什么。可能是一个问题,因为类模板被嵌入到另一个模板中。

实际上,这个问题可能与另一个问题密切相关,正如我之前询问过的关于动态转换的:C++ 动态向下转换到具有模板模板参数是类模板或别名模板的类模板

提出了一个技巧,但在显式实例化的情况下,我想知道是否可以使用另一个(更简单的)技巧。


评论中给出的解决方案:这是 Clang 3.4 中的一个错误