问题标签 [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++ - 如何显式地实例化基模板类?
这个问题正在考虑模板类的显式实例化。
考虑B<T>
从另一个模板类派生的模板类A<T>
。我想显式实例B<T>
化,因为它的方法是从动态链接中调用的,所以这些方法必须实例化,尽管它们没有在代码本身中调用。当然,继承自的方法A<T>
也会被调用,所以它们也必须被实例化。
似乎 C++ 在显式实例化模板类时不会实例化基类,如以下问题所述: Do Explicit Instantiations of C++ Class Templates Instantiate Dependent Base Classes? 例子:
当然,我还需要实例化所有基类。但是,我不想给客户端代码增加负担,因为类层次结构可能非常深。考虑一个包含 10 个或更多模板类的类层次结构。不应敦促客户编写 10 个显式模板实例。这不仅是大量的写作;当我对类层次结构进行更改时,它也会中断。
相反,我想以某种方式实现,无论何时B<T>
被实例化,它的所有基类也是如此。我尝试简单地在 B 本身中实例化基类,如下所示:
但这不会编译。还有其他方法可以实现吗?
c++ - MSVC 中的模板静态定义和显式特化实例化错误
我想知道为什么下面的代码在 gcc 中运行得很好
在 MSVC 2012 上,我无法编译:
从我在 n3242 §14.7 5 中读到的内容
显式实例化和显式特化的声明都不应出现在程序中,除非显式实例化遵循显式特化的声明。
我相信情况就是这样。我错过了什么吗?
templates - 通过模板别名显式实例化类
是否可以通过模板别名显式实例化模板类?
如果是这样,怎么做?否则,有人可以指出讨论并决定反对的 ISO 文件吗?
这不应该实例化A<double>
,因为B<T>
它只是一个不同的名称A<T>
吗?
c++ - 阻止模板类的所有实例化 - 包括支持的类型
如果我有一个模板类MyClass<T>
,并且如果我显式地实例化int
and float
(在cpp
文件中),那么我可以使用extern template class MyClass<int>
andextern template class MyClass<float>
来防止遇到此类的任何编译单元不必要地实例int
化它。float
当然,对于任何其他类型,该类仍将被实例化。
现在我有一个类MyClass2<T>
,它只适用于int
, float
, char
,double
和short
它们的无符号变体(如果适用)。由于我事先知道所有类型,因此该类中所有方法的定义都在cpp
文件中。这也是我MyClass2<T>
为所有上述类型显式实例化的地方。在标题中,我static_assert
阻止用户MyClass2<T>
使用不受支持的类型创建。
有什么方法可以完全防止MyClass2<T>
实例化extern template class MyClass2;
所有类型(例如,尽管我知道这不起作用),包括支持的类型?想一网打尽?_ extern template
我想避免输入extern template class MyClass2<int>
所有支持的类型。
考虑到我已经为这些类型显式实例化了类,这似乎不仅是多余的,而且对于大型项目(比如我正在处理的项目)来说,每次添加新类型时我还需要维护另外几行代码。
c++ - 带有 MinGW 4.8 的 Windows 上的模板未定义参考
我在一个类中使用静态模板成员;模板在软件内置的 cpp 中实例化。我有一个在标头中使用模板方法的软件插件 name()
,但不构建包含实例化的源文件。该构建适用于使用 g++-4.9 的 Linux,但在 MinGW 4.8 上失败。我想知道如何使它与几乎相同的编译器一起工作,但在 Windows 上。
.hpp:
.cpp:
错误 :
是否有任何标志可用于进行某种惰性实例化?或者我应该在我的插件中构建包含模板实例化的 .cpp 吗?
c++ - 强制在模板类中实例化静态成员
我想在模板类中使用静态成员来为从该模板类继承的每个类实例化一个单例对象。
这是一个例子:
这个想法是,X
无论何时创建类型的对象,它们都会将它们自己输入到“注册表”中。Y<T>
派生的类X
是一个模板类,它应该实例化从它继承的每种类型的静态单例对象(使用奇怪的重复模板模式)。
这个想法是“注册表”将包含每个类的一个对象,该对象继承自Y<T>
. 这些类不需要做任何事情就可以添加到注册表中;相反,简单地继承Y<T>
应该足以创建一个添加到注册表的单例对象。
我尝试了这样的代码:
小提琴链接:http: //ideone.com/aWDEg4
所需的行为应该是 one A
、 oneB
和 oneC
应该在注册表中。但它们都不是。问题是Y<T>::instance
没有为任何类实例化,因为它没有在代码中使用。但是,我从不想使用这些字段,它们只是用于实例化单例。那么有没有一种方法可以强制实例化静态字段而无需向派生类(即 、 和 )添加额外A
的B
代码C
?
我知道我可以显式实例化template class Y<A>;
,但这会给派生类添加额外的代码A
。
c++ - Using function-templated code across the g++-nvcc boundary (including kernels)
Suppose I compile the following with NVIDIA CUDA's nvcc compiler:
Now, I want my gcc, non-nvcc code to call foo()
:
I have the appropriate (?) instantiation in the .o/.a/.so file I compile with CUDA.
Can I make that happen?
c++ - 如何正确显式地实例化具有完全专业化成员的模板类?
假设我们有以下文件:
foo.h
foo.cpp
假设类型只会与 int 或 double 作为类型参数一起使用,这是进行显式实例化的正确方法吗?或者您是否还需要在头文件中声明显式特化?
以我展示的方式与 Visual Studio 一起工作,但一位同事在 GCC 上遇到了问题(虽然我刚刚检查过,我认为这是由于其他原因,但无论如何我都会发布这个问题)
c++ - 具有整数作为模板参数的函数模板的显式实例化
我正在尝试显式实例化一个函数模板。请看代码片段
主.cpp:
func() 函数在这个 cpp 文件中
函数.cpp:
class_def.h:
函数模板“sum”的定义位于另一个 hpp 文件中
定义.hpp:
现在,为了实例化这个模板,我在定义下方编写了以下代码语句。
但仍然收到链接错误
对 void sum<1, 2, 3>(int*, myclass<1, 2, 3>&) 的未定义引用
我在这里做错了什么?
c++ - 类模板的显式实例化不实例化构造函数
我正在使用 C++ 开发一个项目,并且在显式实例化模板类时无法理解模板类的哪些成员会被显式实例化。我编写了以下文件,然后使用 Visual C++ 2008 Express Edition 的 Release 配置对其进行编译,然后弹出到反汇编程序中。
忽略这个文件暂时不需要模板,这编译得很好。我将 exe 放入反汇编程序,它告诉我 test<int>::pop(void)、test<int>::push(void) 和 test<int>::~test<int>(void) 是exe中的函数,但我没有看到构造函数。我知道我可以显式实例化构造函数
这导致 test<int>::test<int>(int) 出现在反汇编中作为其他函数的函数。我对显式实例化的理解是它应该告诉编译器为给定的一组参数实例化模板类的所有成员,那么为什么构造函数没有与所有其他成员函数一起显式实例化呢?