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

c++ - 使用模板时出现编译错误“expected unqualified-id”

对于我的代码

我收到编译错误

编译器想告诉我什么?

我该如何解决这些错误?

0 投票
6 回答
2397 浏览

c++ - 如何在 C++ 中为 MPL 向量的所有成员显式实例化模板?

考虑以下头文件:

我想Foo::read在源文件中为 a 中包含的所有类型显式实例化成员函数模板boost::mpl::vector

可能吗?在此先感谢,丹尼尔。

编辑

我找到了一些解决方案 - 似乎Foo::read<T>在结构的构造函数中分配一个指针,然后声明其中的变量,导致实例化:

因此,该过程可以自动化如下:

但我不知道这个解决方案是否可移植且符合标准?(适用于 Intel 和 GNU 编译器。)

0 投票
1 回答
11300 浏览

c++ - 如何使用外部模板

我一直在浏览 C++0x 的 N3291 工作草案。我对外部模板很好奇。第 14.7.3 节规定:

除了内联函数和类模板特化,显式实例化声明具有抑制它们所引用实体的隐式实例化的效果。

仅供参考:术语“显式实例化声明”是extern template. 这是在第 14.7.2 节中定义的。

这听起来像是在说,如果你使用extern template std::vector<int>,那么做任何通常会隐式实例化的事情std::vector<int>都不会这样做。

下一段更有趣:

如果一个实体是同一翻译单元中的显式实例化声明和显式实例化定义的主题,则定义应遵循声明。作为显式实例化声明的主体并且也以其他方式在翻译单元中导致隐式实例化(14.7.1)的实体应是程序中某处显式实例化定义的主体;否则程序格式错误,不需要诊断。

仅供参考:术语“显式实例化定义”是这些事情的标准说法:template std::vector<int>. 也就是说,没有extern.

对我来说,这两件事可以extern template防止隐式实例化,但不会阻止显式实例化。所以如果你这样做:

第二行通过明确地执行第一行阻止隐式发生的事情来有效地否定第一行。

问题是这样的:Visual Studio 2008 似乎不同意。我想使用的方式extern template是防止用户隐式实例化某些常用模板,以便我可以在 .cpp 文件中显式实例化它们以减少编译时间。模板只会被实例化一次。

问题是我必须在 VS2008 中围绕它们进行基本的#ifdef。因为如果单个翻译单元看到了版本extern和非extern版本,它将使extern版本获胜,并且没有人会实例化它。然后是链接器错误。

所以,我的问题是:

  1. 根据 C++0x 的正确行为是什么?是否应该extern template防止显式实例化?
  2. 如果上一个问题的答案是不应该,那么 VS2008 是错误的(当然,它是在规范之前编写的,所以这不是他们的错)。VS2010如何处理这个?它是否实现了正确的extern template行为?
0 投票
0 回答
935 浏览

visual-studio-2010 - 嵌套类、dllexport 和 VS2010

让我们有以下代码:

所以:

  • 我有一个要导出到 DLL 的类。
  • 这个类也有一个要导出到 DLL 的子类。
  • 有类型的变量 ('x...') template <subclass>
  • 成员变量也需要 dll 导出。
  • 所以我需要template <subclass>在使用这种类型之前显式地实例化。
  • 但这是不可能的,因为实例化只能在全局范围内进行。
  • 但是在全局范围内,子类(还)没有定义。

  • template <class::subclass>类体之后的实例化没有效果。

那么如何正确处理这个问题,避免任何警告和错误呢?

顺便说一句:类中模板的实例化在 VS2008 中运行良好。

先感谢您。

葡聚糖

0 投票
2 回答
88 浏览

c++ - 以下模板函数的含义?

我在遗留代码中看到了上面的代码,但不知道它的含义。它既不是常规的非特化函数定义,也不是完整的特化函数定义。

任何想法?

0 投票
1 回答
107 浏览

c++ - 显式实例化模板的动态使用

可能重复:
模板函数的动态分派?

我想使用非类型模板来创建具有不同内存占用的网格单元,而不必在堆上使用动态分配的内存,例如

单元格大小的数量是有限的(大约 10 个),因此我可以轻松地显式地实例化所有单元格。但是,在编译时不知道需要哪一个单元,而仅在运行时才知道。

我知道模板是一个编译时概念,但是有没有办法以这种方式使用模板类,特别是因为我可以保证所有必要的单元格类型都被显式实例化?

0 投票
3 回答
2595 浏览

c++ - 关于静态模板库的链接/编译时间

对于基于模板的类(STL 和 boost),不使用源文件并将实现也放入头文件似乎是一种常见的约定。我认为与头文件和源文件中声明和实现之间的经典分离相比,这将大大增加编译包含头文件的源文件所需的时间。这样做的原因可能是因为您必须在源文件中告诉编译器要使用哪些模板,这可能会导致 .a 文件膨胀。

假设随着库的增长,链接器也需要更多时间,那么就编译包含库头的源文件所需的时间而言,哪种方法会更快?

1.不使用.cpp文件,把整个类,包括实现,放到头文件中

或者

2. 为库本身的源文件里面的各种类型显式编译模板

0 投票
4 回答
3895 浏览

c++ - 什么时候使用模板显式实例化?

我刚刚阅读了有关模板显式实例化的内容:

template struct MyStruct<long>;

它被描述为“非常罕见”,那么它在什么情况下会有用呢?

0 投票
1 回答
809 浏览

c++ - 您如何强制模板化以匹配基类?

我有一个模板函数,它是为类显式实例化的Base,但不是为Derived类实例化的。如何强制传递Derived类(或其他派生类)的用途与该类匹配Base

头文件:

实现文件:

因为我没有为Derivedor显式实例化函数Derived2,所以我得到未定义的引用,但是,我想绑定Base显式定义的类。

对于使用 C++-03 从 Base 派生的所有对象,如何强制模板解析为 Base 类?

Derived我可以通过将类专业化到Base类定义以某种方式做到这一点吗?

0 投票
1 回答
3302 浏览

c++ - 模板类的模板化构造函数的显式实例化

我不确定这是 Clang 3.2 中的错误还是违反 C++03,但似乎模板类的模板化构造函数的显式实例化失败,但模板类的模板化成员函数的显式实例化成功。

例如,使用 clang++ 和 g++ 编译以下代码没有问题:

而以下使用 g++ 编译时没有警告但使用 clang++ 失败:

特别是,我看到了两条错误消息:

这是违反标准还是clang ++中的错误?