问题标签 [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 回答
67 浏览

c++ - 显式模板实例化问题

我无法使用显式模板实例化编译以下代码。

我在这一行得到一个错误:

使用clang,错误是:

错误:“O::Data::DW_enumDescription”中没有名为“descMap”的成员

对于 G++,它是:

错误:ISO C++ 不允许将“O::Data::EnumDescription::descMap”定义为“O::Data::DW_enumDescription::descMap”[-fpermissive]

在这里,我一直使用相同的命名空间Data,即使在我的原始代码中我使用了两个单独的命名空间;但是,即使进行了这种简化,我也会遇到同样的错误。

0 投票
0 回答
34 浏览

c++ - 使用具有多个参数的构造函数显式初始化引用

假设我有课程:

为了论证,我提供宽度和高度的默认值。主要是因为这是作为我实际所做工作的简化示例。

有什么地方可以使用多个参数的构造函数Rect(width,height)来显式初始化Rect &r?我知道如果构造函数只有一个参数我会做什么,我会简单地去:

Box(int width, int length, int height) : r(loneArgument), h(height)

但是现在,我需要使用多个参数显式初始化。然而:

Box(int width, int length, int height) : r(width, height), h(height)

导致编译器错误。当我们在做的时候,也是如此

Box(int width, int length, int height) : r(Rect(width, height)), h(height)

有错误

错误:对“Rect”类型的非 const 左值引用无法绑定到“Rect”类型的临时对象

知道如何解决这个问题吗?或者至少有什么好的理由说明这可能是不好的做法?

我知道我可以轻松地为宽度和高度提供默认值来解决我的问题,但是我使用的是更简单的代码,在我的实际代码中,默认值没有任何意义,因为我想要定义的实际对象需要使用多输入构造函数。

那么有什么办法可以解决这个问题吗?

0 投票
1 回答
427 浏览

c++ - 如何从共享库可移植地导出模板实例

我有这个标题:

有了这个实现:

这个消费者:

和以下 CMakeLists.txt:

如果我使用 MSVC 或 GCC 构建和运行,我会得到预期的输出:

但是,如果我在 mylib.cpp 中启用模板专业化,那么我会使用 GCC 构建失败:

并使用 MSVC:

和铿锵声:

从共享库中 dllexport 模板实例化(可能包括模板部分的模板特化)的正确且可移植的方法是什么?

0 投票
1 回答
49 浏览

c++ - 如何构建模板的显式实例化以提高编译速度?

我特别询问文件结构以及在哪里放置什么。考虑以下内容(这是我当前结构的一个示例):

foo.h包括:

foo-inl.h包括:

一些baz.cpp有:

和其他一些nom_test.cpp有:

如何重组它以利用产品代码(baz.cpp)和测试代码(nom_test.cpp)中的显式实例化。请注意,我不想将测试类型暴露给产品构建。

0 投票
3 回答
81 浏览

c++ - 为什么默认参数不能与参数包一起使用?

由于8.3.6 ([dcl.fct.default])/4

在给定的函数声明中,带有默认实参的形参后面的每个形参都应具有在此声明或先前声明中提供的默认实参,或者应为函数形参包。

以下应编译:

但它不会编译,因为foo("str3")这会使编译器感到困惑。它抱怨没有匹配的调用函数,foo(const char*)并且它无法将"str3"(type const char*) 转换为 type int

我知道可以通过函数重载或使用命名参数习语来解决这个问题(参见在哪里将默认值参数放置在 c++ 中的可变长度函数中?以及默认参数和可变参数函数)。但是,我想知道编译器是否只是愚蠢的,或者是否有真正的原因导致上面代码示例中的预期行为没有实现。换句话说,即使我将函数显式实例化为,为什么编译器会抱怨foo<const char*>(int, const char*)?就好像显式实例化只是忽略了默认参数的值。为什么?

0 投票
0 回答
36 浏览

c++ - 避免在模板化函数中显式实例化

我的意思是编写一个模板函数,它应该可用于大量的typenames。所以,我的意思是避免需要显式实例化。

在这种情况下,是否必须在头文件中写入函数的定义?

还有其他方法吗?(它将在多个地方使用,因此不能将定义写入任何单个源文件中)。

PS:为什么模板只能在头文件中实现? 指模板类。尽管认为这同样适用于函数可能是合理的,但也许有时情况并非如此。因此,该链接不回答这个特定问题。

0 投票
1 回答
107 浏览

c++ - 函数模板的实例化

在下面的程序中,我们获取没有可用定义的函数模板的地址。

我被告知编译器决定在获取地址时实例化一个函数模板,但是上面的程序编译得很好(当然链接器会抛出一个它找不到定义的错误fun)。仅当我们使用显式实例化时编译才会失败:

这是否意味着只有编译第二个源代码才能实例化函数模板?或者它是否也在第一个实例化但我错过了一些东西?

提前致谢!

0 投票
1 回答
737 浏览

c++ - 使用 clang 显式 C++ 模板实例化

注意:几个相关问题(例如,这个问题)最终被标记为与此问题重复。我知道这个特定问题,并按照相应答案中的解决方案进行操作。但是,不同的编译器会产生不同的行为,我不知道为什么。

我的库有一个类模板,我想为库中的某些模板参数提供实例,因为模板需要一些大量的编译时间。类模板可能如下所示 ( stack.hpp)

它的实现驻留在相应的stack.tpp文件中

由于我只想为某些模板参数提供支持,因此我stack.cpp创建了以下显式模板实例:

这可以使用 g++ 和 clang++ 编译,但生成的共享库的符号存在差异:

对比

在我的应用程序中,使用 clang++ 找不到这样一个显式实例化类的构造函数,但使用 g++ 可以正常工作。我认为这个基本的 MWE 给出了原因。谁能告诉我如何使用 clang++ 获取类模板的构造函数符号?

0 投票
1 回答
111 浏览

c++ - 使用元组显式实例化模板

要显式实例化类模板,我可以执行以下操作:

这很好,因为Foo<float>当在许多地方使用该类时,现在只需实例化一次。是否可以Foo<T>使用预定类型的元组显式实例化?可以说元组是std::tuple<float, int, bool>,我想用它来实例化Foo<float>, Foo<int>Foo<bool>

0 投票
1 回答
657 浏览

c++ - 将 `extern template` 与第三方仅标头库一起使用

我正在使用glmlibrary,它是用于 3D 图形的仅限标题的数学实用程序集合。通过-ftime-trace在 Clang 和 上使用ClangBuildAnalyzer,我注意到很多时间都花在实例化glm类型上:


因此,我决定为 . 创建一个包装头/源对glm,并使用它extern template来避免不必要的实例化:

现在,在我的项目中<glm.hpp>,我不包含,而是包含"glmwrapper.h"。不幸的是,这并没有改变任何东西。使用-ftime-traceandClangBuildAnalyzer再次报告相同数量的实例化。也没有可测量的编译时间差异。

怀疑这是因为#include <glm.hpp>实际上最终包含了模板定义,而在这一点上,后续extern template声明只是多余的。

有没有办法在不修改库的情况下实现我想要的glm


在伪代码中,我有点想要这样的东西: