问题标签 [explicit-specialization]
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++ - 显式特化已删除的主模板
GCC 接受这一点,但 Clang 拒绝将其作为重新定义:
谁是对的?
c++ - 为什么“外部模板”不能与 shared_ptr 一起使用?
为了防止在数百个文件中被冗余实例化,我有一个(看似)聪明的想法,extern template class std::shared_ptr<SomeWidelyUsedClass>
即立即在 stdafx.h中使用,我认为我可以放置在单个 .cpp 中以强制进行单个实例化并希望节省编译/链接时间。但是,对生成的 .cod 和 .obj 文件的检查表明,无论如何都在到处创建代码。但是,如果我在自己的模板类中使用这种完全相同的技术,它就会按预期工作。有什么特别的地方排除了这种用途吗?也许某些东西本身会迫使编译器在它到达我的语句之前创建一个实例化(我很确定在 stdafx.h 中没有任何更高的东西可以使用)?#include <memory>
std::shared_ptr<SomeWidelyUsedClass>
template class std::shared_ptr<SomeWidelyUsedClass>
shared_ptr<SomeWidelyUsedClass>
shared_ptr
<memory>
extern template
shared_ptr
澄清:
然后:
和:
c++ - MSVC 中的模板静态定义和显式特化实例化错误
我想知道为什么下面的代码在 gcc 中运行得很好
在 MSVC 2012 上,我无法编译:
从我在 n3242 §14.7 5 中读到的内容
显式实例化和显式特化的声明都不应出现在程序中,除非显式实例化遵循显式特化的声明。
我相信情况就是这样。我错过了什么吗?
c++ - 为什么我不能调用以下代码的 C++ 显式特化版本?
简介:我想显式地显示最长的字符串,我以为是“Carmelo Anthony”,结果是“Jordan”。我知道使用通用模板版本而不是显式模板版本。所以它只是比较点的值(地址值),对吧?但是我怎么能看到“卡梅罗·安东尼”呢?感谢您回答我的第一篇文章!
c++ - C++ 显式返回类型模板特化
这是对这个(更一般的)问题的跟进:previous question。此处给出了对当前问题的部分答案:对当前问题的部分答案。
我对基于模板参数的返回类型的显式特化感兴趣。虽然上面给出的答案提供了问题的解决方案,但我相信有一种更优雅的方法可以使用 C++11/14 技术解决问题:
上面的代码使用 gcc 4.8.3(带有 -std=c++0x 标志)按预期编译和工作。但是,它会发出以下警告:
getOutputPort2
函数使用auto
没有尾随返回类型的类型说明符。
据我了解,这将成为 C++14 标准的一部分。但是,有没有办法在 C++11 中实现上述功能?可以decltype
在这里使用吗?
编辑。在下面的评论之后,我还想问一个额外的问题。从 C++14 标准的角度来看,上面的代码是否有效?如果不是,为什么不呢?
c++ - 在 C++14 中使用自动返回“类型”进行显式模板特化是否有效?
我重复上一个问题的代码以使这个问题自成一体。如果使用 gcc 4.8.3 编译下面的代码,它不会发出任何警告。与-std=c++1y
. -std=c++0x
但是,如果使用标志编译,它会发出警告。在上一个问题的上下文中,有人说代码不能使用 gcc 4.9.0 编译。不幸的是,目前,我并不完全了解它auto
是如何实现的。因此,如果有人能回答以下问题,我将不胜感激:
1)。相对于 C++14 标准,下面的代码是有效的 C++ 吗?
2)。如果是的话,这段代码会被认为是一种好的风格吗?如果不是,为什么不呢?
3)。为什么在使用 C++11 编译器时下面的代码会编译和工作(有时)?或者,为什么它并不总是有效?是否有任何特定的标志/选项/设置可以阻止它工作?
c++ - 显式特化不能是友元声明
编码
给出编译错误
当使用 gcc 和
在 VS2013 中编译时
我知道标准是这样说的,但是为什么呢?我想了解原因(幕后)有很多文章写着“显式专业化不能是朋友声明。”,但我不明白为什么。有任何想法吗?
c++ - 类模板特殊成员函数显式特化
在 c++ iso 2003/2011 [temp.expl.spec]/4 中写道
类模板的成员函数、成员类或静态数据成员可以显式地特化为隐式实例化的类特化;在这种情况下,类模板的定义应在类模板成员的显式特化声明点的范围内。如果类模板成员的这种显式特化命名了一个隐式声明的特殊成员函数(第 12 条),则该程序是非良构的。
因此,据我了解,应在显式专门化之前定义允许专门化的特殊功能。
但
有这样的限制的原因是什么?
c++ - 显式特化的成员也需要其包含的类模板也显式特化
我在很多文章中读到,对于类模板,当特化成员模板时,包含特化成员模板的类也应显式特化。标准中有没有关于它的观点,是否有任何理由有这样的限制?我的意思是在引擎盖下。
为什么这是不允许的。
c++ - 通过部分模板特化扩展命名空间 std
据我所知,我们被允许(除了一些我不会在这里提到的例外)namespace std
通过完全专门化一个模板函数来“扩展” ,std
例如std::swap
是完全有效的。
从 C++11 开始,我们现在可以部分特化函数。我相信我们可以玩同样的游戏并std
通过部分专业化进行扩展,比如
但是我对此不确定,也无法在标准中找到正确的解释部分。上面的代码是正确的还是导致UB?
PS:正如@Columbo 在答案中提到的,我们不能部分专门化函数模板,即使在 C++11/14 中也是如此。出于某种原因,我认为可以做到这一点,我相信这至少是一个提议。