- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 C++03 中,我们有模板显式实例化定义 ( template class Foo<int>
),它强制模板类的实例化。
在 C++11 中,我们有模板显式实例化声明 ( extern template class Foo<int>
),它应该防止模板类的隐式实例化。 (Class template instantiation)
我正在尝试模拟我实际上需要显式实例化声明以减少编译时间的情况。但我不能。看起来没有这个功能一切都可以工作(或者不使用它)。
这是一个例子:
//Foo.h
#pragma once
template<class T>
class Foo
{
T inst;
public:
Foo(T i);
T& get() const;
};
//Foo.cpp
#include "stdafx.h"
#include "Foo.h"
template<class T>
Foo<T>::Foo(T inst) : inst(inst) { }
template<class T>
T& Foo<T>::get() const { return inst; }
template class Foo<int>; //explicit instantiation definition
//test1.h
#pragma once
#include "Foo.h"
//This line does not work
//extern template class Foo<int>; //explicit instantiation declaration.
void baz();
//test1.cpp
#include "stdafx.h"
#include "test1.h"
void baz()
{
Foo<int> foo(10);
int i = foo.get();
}
结果不取决于我是否评论( extern template class Foo<int>;
)行。
这是两个 *.obj 文件的符号:
dumpbin /SYMBOLS test1.obj
011 00000000 UNDEF notype () External | ??0?$Foo@H@@QAE@H@Z (public: __thiscall Foo::Foo(int))'
012 00000000 UNDEF notype () External | ?get@?$Foo@H@@QBEHXZ (public: int __thiscall Foo::get(void)const )
013 00000000 SECT4 notype () External | ?baz@@YAXXZ (void __cdecl baz(void))
...
dumpbin /SYMBOLS Foo.obj
017 00000000 SECT4 notype () External | ??0?$Foo@H@@QAE@H@Z (public: __thiscall Foo::Foo(int))
018 00000000 SECT6 notype () External | ?get@?$Foo@H@@QBEHXZ (public: int __thiscall Foo::get(void)const )
注意什么Foo<int>::Foo<int>(int)
和int Foo<int>::get(void)const
在 test1.obj 中标记为 UNDEF,这意味着它们必须在其他地方解析(即 Foo 仅编译一次)。
如果我在 Foo.h 文件中定义完整模板(没有显式实例化定义),则 extern template
没有帮助 - 模板编译两次(在 test1.cpp 和 test2.cpp 中)。
示例:
//test1.h
#pragma once
#include "Foo.h"
void baz();
//test1.cpp
#include "stdafx.h"
#include "test1.h"
void baz()
{
Foo<int> foo(10); //implicit instantiation of Foo<int>
int i = foo.get();
}
//test2.h
#pragma once
#include "Foo.h"
extern template class Foo<int>;
void bar();
//test2.cpp
#include "stdafx.h"
#include "test2.h"
void bar()
{
Foo<int> foo(10); //should refer to Foo<int> from test1.obj but IT IS NOT
int i = foo.get();
}
以下是符号转储:
dumpbin /SYMBOLS test2.obj
01D 00000000 SECT4 notype () External | ??0?$Foo@H@@QAE@H@Z (public: __thiscall Foo::Foo(int))
01E 00000000 SECT8 notype () External | ?get@?$Foo@H@@QBEHXZ (public: int __thiscall Foo::get(void)const )
01F 00000000 SECT6 notype () External | ?bar@@YAXXZ (void __cdecl bar(void))
dumpbin /SYMBOLS test1.obj
01D 00000000 SECT6 notype () External | ?baz@@YAXXZ (void __cdecl baz(void))
01E 00000000 SECT4 notype () External | ??0?$Foo@H@@QAE@H@Z (public: __thiscall Foo::Foo(int))
01F 00000000 SECT8 notype () External | ?get@?$Foo@H@@QBEHXZ (public: int __thiscall Foo::get(void)const )
在 Foo 提供的两个 *.obj 文件中。
所以我的问题是显式实例化声明有什么用处?或者也许我在测试中遗漏了一些东西?
我使用VS2013编译器。
最佳答案
这是为什么 ATTEMP#2 不能按我想要的方式工作的一个很好的解释: Is there a bug with extern template in Visual C++?
简而言之,当您在头文件中定义和实现模板时,编译器可能会内联它。然后它的显式实例化定义按标准不起作用(14.7.2/10“显式实例化”)。
所以我们需要强制编译器不内联模板。例如,在声明之后立即实现它。
template<class T>
class Foo {
...
T get() const;
};
template<class T>
T Foo<T>::get() const
{ ... }
关于C++11 外部模板 : where do we actually need them?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40281137/
我经常发现自己想要编写以下形式的通用类定义 public class Foo> 例如在这样的设置中: public interface ChangeHandler { public void
我有一些对象被放入队列中。队列中的所有对象都实现相同的基接口(interface),这也要求它们实现 IEquatable<>。 我想验证是否以正确的顺序将正确的对象放入队列中。 当我编写一个断言 C
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我有一串数字和字符 c2 = "list of 2nd C2 H2O 1 12 123" 我需要删除所有实际数字,即 1、12、123,而不是那些属于字符集的数字,即 2nd、C2、H2O。 到目前为
git repo : django tutorial 我一直在关注上述 django 项目,该项目着眼于创建人与人之间的聊天。我遇到过这部分: def message_list(request, se
gitpod GitHub 页面说 Gitpod is an open-source Kubernetes application providing prebuilt,collaborative d
这是一个示例代码,我在这里抛出一个异常,由于某种原因,它在没有 try/catch 代码块的情况下工作得很好。 我是否必须在这个方法“EntryDelete”中处理这个问题或者我必须在调用该方法的地方
我的数据集中有以下列: id |用户 ID |开始日期 |结束日期 |检查日期 我想从第一列获取check_date,找到check_date在start_date和end_date。然后计算每个 u
简而言之: 在 pytorch 中使用 adadelta 优化器时,我无法绘制 lr/epoch 曲线,因为 optimizer.param_groups[0]['lr'] 总是返回相同的值。 详细说
假设我有以下 C 代码: int* vector = (int*)malloc(5 * sizeof(int)); malloc 返回一个空指针,因为不知道要求为什么分配空间。 因此,我们将 void
在 Java 中将形状渲染为其“实际大小”的简单方法是什么?例如,我有一个直径为 1"的 pipe ,我想在屏幕上将其描绘为 1"圆的轮廓。 Graphics2D 方法 drawOval(int x,
我阅读了很多关于 Node js 的文章,试图理解事件循环及其模式/反模式。许多作者没有提到的一件事是 Node 实际上处理线程。然而,应用程序程序员当然无法访问它们,但很高兴知道它们存在以及它们何时
什么mode:shim做? 我在这个网站上搜索了一种强制闪光的方法。代码开发人员针对遇到我所面临的确切问题的某个人的问题写了这个答案: MediaElement.js - force Chrome t
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭11 年前。 Improve th
在 C++03 中,我们有模板显式实例化定义 ( template class Foo ),它强制模板类的实例化。 在 C++11 中,我们有模板显式实例化声明 ( extern template c
我有一个相当复杂的联接的执行计划,它显示在表上执行索引查找,“实际行数”读数约为 70,000,而实际上表中总共只有约 600 行(估计行数仅为 127)。 请注意,所有统计信息都是最新的,并且查询的
我的学校作业涉及编写一个简单的网络爬虫来爬行维基百科。该作业规定我不能使用任何外部库,因此我一直在使用 java.net.URL 类。基于official tutorial以及我的教授给出的一些代码:
您好,我是集成测试新手。我的断言状态面临一些困难。 这是错误 java.lang.AssertionError: Status Expected :204 Actual :404 这是测试代码
我刚刚习惯 Subversion,并且有一个关于版本控制的基本问题。 我已在我的网络中托管的服务器“S”上创建了 SVN 存储库。假设我从网络中的另一台计算机“A”“导入”代码、文件、目录等,它会添加
我没能弄清楚 Spark SQL 连接操作实际上是如何工作的。我已阅读pretty massive explanation ,但它并没有阐明一些问题。 示例 例如,您有两个数据库表保存在 Spark
我是一名优秀的程序员,十分优秀!