问题标签 [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++ - explicit instantiation of a function
Why will i use explicit instantiation of a function template, for a type? If I do not use explicit instantiation of the function, the template is used to create the necessary function then what is the use of explicit instantiation?
In the above eg. explicit instantiation is done for char type. What is the use of this?? If the compiler can make use of the template to make a fn for char type.
If there are any refrences that can help me clear my concept, pls do include those.
c++ - DLL 中模板类的链接器错误(未解析的符号)
使用 DLL(Visual Studio 2008 编译器)中的(专用)模板类时,出现链接器错误 - 未解析的符号。我尝试使用 Stackoverflow 中描述的“显式模板实例化”技巧,但没有奏效。我将其分解为一个非常简单的可重现示例:
我有一个动态库(DLL)'MyTemplates.lib',带有一个头文件'MyTemplates.h'(和一个源文件'MyTemplates.cpp',没有任何代码,只包含这个头文件),内容如下:
现在我有另一个动态库“UserLibary”(链接到“MyTemplates.lib”),其中包含文件“Util.h”和 Util.cpp。文件“Util.h”如下:
文件“Util.cpp”的内容是:
现在的问题是我的库“UserLibrary”编译得很好,但它给出了两个链接器错误,如下所示:
所以链接器找不到类的默认构造函数A<int>
和B<int>
. 为什么这是可能的,我怎样才能摆脱这些链接器错误?我认为类的显式模板实例化A<int>
和B<int>
(在文件'MyTemplates.h'中)可以解决这个问题,但不幸的是它似乎没有帮助 - 还是我以错误的方式使用它?我的编译器是Visual Studio 2008,操作系统是windows 7 64位,代码是64位编译的。
c++11 - C++ 与匿名命名空间的内部链接:这真的是最好的吗?
在我的类Foo
中,我需要使用辅助函数构造一个对象,并且 - 作为有助于强制代码结构的任意第二个函数 - 设置一个处理程序。
由于内部链接而暴露定义似乎是做到这一点的唯一方法,但它冒犯了我的风格,我希望我忽略了另一种实现这一点的方法。这是一个完整的例子来说明这一点(也包括makefile!):
哪个编译,一切都是肉汁,直到我尝试在外部使用它。
当我尝试在没有 的情况下进行编译时ideal_bar.cpp
,-Werror
出现以下错误:
并且-Werror
,它抓住了这个的根源:
问题:避免这种情况的唯一方法是添加foo_impl.hpp
,从而将定义Init()
和任何其他必需项从Impl
to暴露出来bar.cpp
?这是实践中的一个工作示例:
然后返回fugly_bar.cpp
,#include "foo_impl.hpp"
例如:
为了完整起见,这里是fugly_foo.cpp
:
fugly_foo_impl.hpp
:
为了让事情变得简单,一个GNUmakefile
:
我需要使用一种模式来公开私有实现(例如)_impl.hpp
的实际定义和其他内部结构,这冒犯了我的风格,我想知道这是否真的和它一样好?我能说什么,C++11 真的很干净,像这样的偏差似乎我做错了什么。Init()
Impl
因为这最初只是一个警告,所以我似乎可以在这上面撒上一些语法来将解析延迟到链接时间,但是由于使用了匿名命名空间和此处使用 PIMPL 成语,我不乐观。
感觉应该有一种方法可以显式实例化Init()
或任何其他需要内部链接的函数,而无需将定义暴露给bar.cpp
. extern
也许使用and的某种组合template
,但同样,使用匿名命名空间和Init()
埋在的定义foo.cpp
,这可能是唯一的方法。
我希望我错了,但遗憾的是我不这么认为。
java - Spring bean 字段(显式实例化)有时分配为 null
有一天,我们遇到了一个事件,即由于 NPE 导致应用程序开始崩溃。我找到了它崩溃的地方,但我不确定它为什么会发生。
粗略地说,假设我有一个A类,它同时出现一个 spring bean。此类具有显式实例化的字段属性(是的,我知道它听起来如何)和使用此字段的方法propertyUser :
经过一段时间的正常工作,属性字段已变为空,这导致propertyUser方法的 NPE。我更改了这个遗留代码,现在这个属性也是通过 spring 容器分配的,但是我需要确定这是出现这个错误的原因。
所以如果有人能给我一个提示,我会很高兴。
c++ - c ++类模板显式实例化适用于macos,不适用于ubuntu
我正在编写一些我想发布为 .h 文件和静态库的代码。代码使用 c++ 模板编写,在 .h 文件中声明类,在 .cpp 文件中定义。我使用“显式实例化”技巧使将代码编译成静态库成为可能。显式实例化添加在 .cpp 文件的末尾。我写了一些代码来测试这个库。它在 macOS 和 Windows 上运行良好,但在 ubuntu 上它返回“未定义引用”链接错误。似乎“显式实例化”技巧在 ubuntu 上不起作用。有人知道为什么吗?
ubuntu 上的 g++ 版本是 4.5.3。
编辑
这是模板类的 .h 文件:
模板类的 .cpp 文件如下:
测试代码如下:
错误信息是:
c++ - 类模板的动态实例化被认为是显式的还是隐式的?
如果我有一个类模板,并且我使用指向专用实例的动态分配实例的智能指针,这是否会导致整个类模板由编译器定义,或者它是否还会等待从指针调用成员函数在实例化之前?
整个类模板是否在 mark1 处实例化?
如果不是,这是否意味着此代码将正确编译并且成员函数 Test::nothing() 不会被实例化?
c++ - 单独的编译和模板显式实例化
总结
这个问题是关于在几个不同的翻译单元中实现单个模板类实例化的单独编译。
问题
对于非模板类,可以将定义放在多个 .cpp 文件中并分别编译。例如:
档案啊:
文件 A1.cpp:
文件 A2.cpp:
现在我尝试对模板类做类似的事情。因为我确切地知道我需要哪些实例,所以我明确地实例化了模板。我正在分别编译每个实例化,因为成员函数包含相当大的数学表达式,这可能会在高优化级别上大大降低编译器的速度。所以我尝试了以下方法:
文件 TA.h:
文件 TA1.cpp:
文件 TA2.cpp:
它适用于 Linux 上的 clang 和 GCC,但在重复符号错误期间链接期间在 Mac 上使用 GCC 失败(在此示例中,由于 func3,它在 TA1.cpp 和 TA2.cpp 中都已实例化)。
然后我偶然发现了标准中的这句话:
C++11.14.7,第 5 段:
对于给定的模板和给定的模板参数集,
-- 显式实例化定义在程序中最多出现一次,
-- ...
这是否意味着即使使用显式实例化也不可能(不允许)单独编译模板类(隐式实例化显然不可能)?
PS我不在乎,因为我已经得到了答案,但是无论谁认为它都在这里得到了回答https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-头文件错误。
c++ - gcc 中的模板显式实例化(定义和声明)
假设有这样的代码:
其中CLASS_KEY1
,CLASS_KEY2
和PREFIX
是宏。CLASS_KEY1
并且CLASS_KEY2
可以扩展为class
,struct
或union
关键字。PREFIX
可以扩展为空字符集或extern
关键字。
下表显示了何时为宏值的所有组合(编译器 gcc-4.8.1,选项)编译此类代码(Yes
- 编译,No
- 不编译-std=c++11
):
它是 gcc 中的错误还是标准要求(奇怪的情况用问号标记)?其他编译器呢?
c++ - 分离没有'extern'的模板类的定义/实例化
(不再那么新的)C++11 标准引入了extern
模板关键字。它的目的是告诉编译器不应在使用时实例化模板,而是将在另一个翻译单元中实例化它(因此在链接时会有一个可用的实例化) - 至少 AFAIK。
现在,即使在 C++11 之前的时代,我们也使用类似的东西将模板类的声明/定义与其实例化分开,以加快编译速度,例如:
point.h:类定义
point.cpp : 方法定义
point_2d.cpp : 类实例化(2D 版本)
point_3d.cpp : 类实例化(3D 版本)
main.cpp : 2D 和 3D 点的使用
现在我想知道:
- 我们的方法是有效的 C++(03 或 11)代码还是我们只是幸运地工作了?
- 使用 C++11,我们是否能够通过包含
point.cpp
inmain.cpp
和声明来实现相同的目标extern template <int dim> struct Point;
?
c++ - 跨 DLL 的 C++ 成员函数显式模板实例化
我正在创建一个DLL
in C++
using Visual Studio 2013
on Windows 8.1 Update 1
。有一个名为的类XMLData
,它有一个名为 的公共成员函数getAttribute
。
XMLData.h
在 DLL 中,每次使用都会按照您的预期进行实例化并且工作正常。
但是,在应用程序中,我当然会得到未<typename Type>
在 DLL 中使用的未定义引用。
因此,我尝试使用显式模板实例化(如果有的话,我宁愿不将实现放在标题中,以便进行学习练习):
XMLData.cpp
但是,我仍然在使用 DLL 的应用程序中得到一个未解析的外部:
输出
DLL_EXPORTED
我哪里错了?