问题标签 [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.
c++ - 为什么我使用模板函数得到“调用'...'没有匹配的函数”?
使用以下代码:
材料.h:
材料.h:
confdef.h:
主文件
(这里是重现错误的上述代码的在线版本。)
我在注释行收到以下编译错误消息:
调用“MakeMaterial”没有匹配的函数
我究竟做错了什么?显式实例化不应该允许编译器看到正确的函数吗?
如果我明确地编写代码,代码就会编译MakeMaterial<solid>
,但这里的重点是type
从Config
参数中推断出来。我怎样才能做到这一点?
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 中被隐式实例化,即使在那个翻译单元中没有使用这个规范。
c++ - 用于模板实例化的 Clang/g++ 选项
我正在寻找 g++/clang++ 上的编译器选项来控制显式实例化中方法的实例化。
假设我有一个Foo<T>
带有一些显式实例化的类模板
我想启用所有公共方法的实例化。这似乎不是默认设置,因为我必须为所有成员添加手动实例化以避免链接错误;
c++ - 模板内静态成员的初始化
这是一个最小的例子:
该程序使用 g++ 4.9.2 写入 42,但使用 Visual Studio 2015 RC 写入 0。另外,如果我取消显式实例化的注释,VS2015RC 也会给出 42,这很有趣,因为这里的模板参数与main
函数中使用的不同。
这是一个错误吗?我假设 g++ 是正确的,因为有对b
inside的引用foo
,所以B
应该调用构造函数。
编辑:有一个简单的解决方法 - 如果在 中有一个非静态变量B
,在 中引用A
,VS2015RC 将正确编译:
这似乎有效,尽管b.y
作为一个声明,显然是 NOP。
c++ - 围绕显式模板实例化的困惑
好吧,我想我对显式模板实例化感到非常困惑~>_<~
- 显式实例化声明能否利用隐式实例化定义?
- 如果程序中同时存在显式和隐式实例化定义怎么办?他们最终会崩溃成一个单一的吗?
- 显式实例化声明放在隐式实例化定义之后是否有任何影响?
另外,请参见以下代码:
导致链接错误
使用 GCC 5.2,但使用 clang 3.6 构建良好。根据标准,哪一个是正确的?
我希望有一种有见地的方法来理解显式模板实例化,以便可以从逻辑上推断和解释上述所有问题的答案。
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?
c++ - 显式模板实例化定义是否也抑制隐式实例化?
我知道显式实例化声明会抑制隐式实例化。但是如果只有一个明确的实例化定义呢?它是否也抑制了以下隐式实例化?
例如:
显式模板实例化定义是否抑制了随后的隐式实例化?我知道,如果我通过在extern
关键字前面加上显式定义将显式定义变为声明,则会抑制隐式实例化。
c++ - 当显式模板实例化定义在显式声明之前时,GCC 和 clang 不同意
请参阅以下代码:
虽然 GCC 5.2 编译良好,但 clang 3.6 给出以下错误消息:
不过,对于以下代码
GCC 和 clang 都出错了。GCC 的消息是
铿锵的声音是
这两个家伙到底是怎么回事?标准是否禁止显式模板实例化声明前面有显式定义?这对我来说意义不大。毕竟,先定义再声明又有什么坏处呢?想想非模板函数的情况。
c++ - 如何导出从 Visual Studio 中显式实例化的模板派生的类?
在我的 DLL 中,我有一个类模板和从该模板的实例派生的第二个类。这两个类都应导出并在其他 DLL 中使用。编译器是 Visual Studio 2013。我希望模板代码在一个翻译单元中被实例化,所以我使用显式实例化。
DLL1 中的代码分布如下。基类模板:
派生类:
理论是extern语句阻止在所有翻译单元中实例化,除了 BaseTemplate.cpp,其中执行显式实例化。但是,我收到以下警告(在我的项目中被视为错误,因此会破坏构建):
似乎派生类的导出触发了实例化,忽略了extern语句。如果我从 Derived 类中删除导出宏,则 DLL1 编译时不会发出警告(但其他 DLL 显然无法链接)。如果我在 Derived 类中聚合 BaseTemplate 类型的成员而不是继承,它也可以正常工作(即使是导出)。
如何在 Visual Studio 中组合显式模板实例化和导出的派生类?
c++ - C++ 模板显式实例化,模板参数是类模板
尝试显式实例化类时遇到链接器问题。使用 C++11,LLVM 5.1。这是一个最小的工作示例:
声明.h:
A_implementation.h:
显式实例化.cpp:
主.cpp:
这是链接器错误:
看起来编译器将第二个显式实例化视为与 main 的第二个声明不同的东西。我不明白为什么。可能是一个问题,因为类模板被嵌入到另一个模板中。
实际上,这个问题可能与另一个问题密切相关,正如我之前询问过的关于动态转换的:C++ 动态向下转换到具有模板模板参数是类模板或别名模板的类模板
提出了一个技巧,但在显式实例化的情况下,我想知道是否可以使用另一个(更简单的)技巧。
评论中给出的解决方案:这是 Clang 3.4 中的一个错误