问题标签 [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.

0 投票
1 回答
1387 浏览

c++ - C++ 函数模板特化和重载

考虑到这段代码:

诸如int *p; f(p);will output之类的调用First

如果声明的顺序改变了,像这样:

相同的调用 ( int *p; f(p);) 将输出Third

我读到了函数模板重载决议发生的方式:首先,决议只考虑非模板函数底层基础模板。在选择“最特化”的那个之后,如果它是一个模板函数并且它对推导(或显式指定)的参数具有特化,则调用该特化。

现在我的问题是:如何确定函数是专门针对哪个基础模板?在我的示例中,对于哪个函数模板重载( (1) 或 (3) )是 (2) 特化?

我的猜测是,在声明特化时,会考虑已声明的模板,并从那些最“特化”(其参数与该特化“最接近”的)中选择。这个对吗?另外,您能否指出标准中指定的位置?

0 投票
0 回答
57 浏览

c++ - 具有非类型模板参数的函数模板的专业化

我使用函数模板来计算维度矩阵的行列式。

我使用以下函数模板的特化来终止递归。

但专业化不能通过编译。发生了一个错误。

错误 C2912:显式特化“双行列式 <1>(double [][1])”不是函数模板的特化

有什么问题?我怎样才能终止它?


2017/6/23 我修改了代码,它在 GCC 上工作!

0 投票
1 回答
209 浏览

c++ - 函数模板的显式特化(它是类模板的成员)会产生“不允许部分特化”错误,为什么?

我正在努力Visual Studio 2015 community edition

假设我有一个像这样的简单类:(
下面的示例“应该”是可编译的,因为它包含所有必要的东西,不幸的是,它会产生错误)。

错误:

我认为自己是一名初级爱好者程序员,所以我当然错了,但我相信两者erase<class_foo<T>::tag_aaa>()都是函数erase<class_foo<T>::tag_bbb>()的明确专业化template <typename tag> void erase();。因此,它们是被允许的。我相信这个错误是由于一些错误的语法造成的,但我找不到错误。

问题:

  • 我正在尝试做的事情是否允许?
  • 如果是,我做错了什么?
  • 如果是,那么特化此功能的正确语法是什么(erase)?
0 投票
1 回答
1881 浏览

c++ - 实例化后“CheckIntMap<>”的显式特化

铛:

编译错误:

此代码在 g++ 5.4(linux) 中编译

我怎样才能解决这个问题。

0 投票
1 回答
147 浏览

c++ - 嵌套类显式规范:不同的编译器行为

以下代码使用clang++ 6.0.0g++ 7.3.0编译良好(编译标志为-std=c++14 -Wall -Wextra -Werror -pedantic-errors)但无法使用vc++ 19.10.25017编译(编译标志为/Za

vc++编译错误信息:

错误 C2906:“void A<int>::B<char>::foo(void)”:显式特化需要“模板 <>”

在这种情况下,什么行为符合标准?

0 投票
1 回答
137 浏览

c++ - 具有静态方法的模板专用类是否占用存储空间?

(我很抱歉标题凌乱。我很乐意接受改进它的建议。)

我会尽量直截了当。我有以下代码:

文件1.hpp

文件 2.hpp:

文件 3.hpp:

主文件

问题:

  1. 没有使用显式专业化MatOps<double>。然而,MatOps<double>实际上是实例化的吗?或更粗略地说:包含 file3.hpp 是否占用任何存储空间?
  2. 没有使用MatOps<float>::method3(),但我正在使用类中的其他方法。由于我明确使用MatOps<float>,编译器是否生成代码MatOps<float>::method3()

理由:我被要求遵循 MISRA C++:2003 标准中的一些准则。虽然已经过时,但我被鼓励使用其中合理的任何东西。特别是,有一条规则如下:

头文件应用于声明对象、函数、内联函数、函数模板、typedef、宏、类和类模板,并且不应包含或生成占用存储空间的对象或函数(或函数或对象的片段)的定义。

头文件被认为是通过#include指令包含的任何文件,无论名称或后缀如何。

我的代码被大量模板化,因此我可以根据此规则包含任何文件。当我进行完全专业化时,我的问题就出现了(我只做其中两个:file2.hpp 和 file3.hpp 中列出的那些)。什么完整模板专业化?即使不使用,是否也会为它们生成代码?最终,它们会占用存储空间吗?

0 投票
3 回答
1797 浏览

c++ - 显式模板专业化 - 多个定义

我以前做过明确的专业化,我只是不明白为什么这不起作用:

StringUtils.hpp

StringUtils.tpp

我得到的错误是抱怨函数的多个定义的链接器错误toString

项目中的许多文件使用#include "StringUtils.hpp".

如何尝试修复此错误?课堂上有什么问题StringUtils吗?

0 投票
1 回答
271 浏览

c++ - Explicit specialization of template variable

Similar to this question about explicit specialisation of static const class members of a template class, and this question about explicit specialisation of a template class, but my issue is with explicit specialisation of a variable template.

My MCVE:

Compile command: $CXX -std=c++14 my_specialised_literal.cc main.cc This compiles and seems to work as expected on just about every compiler version I've tried, but gives linker errors with clang-9:

/tmp/main-ec49c7.o:(.rodata+0x0): multiple definition of `val'

/tmp/my_specialised_literal-521691.o:(.rodata+0x0): first defined here

Is this an ODR violation silently accepted by most compiler versions, or is clang-9 wrong in some way? If the former, I know that if I could use C++17 I could fix it by making the specialisation inline, but what is a C++14 fix for the problem?

0 投票
2 回答
76 浏览

c++ - decltype(function) 的类型是什么,为什么我在这里不需要“const”限定符?

我对decltype函数的类型感到困惑。它既不是函数指针也不是函子。我该如何使用它?以及为什么这里的完整模板专业化不需要const限定符。

如果我删除&,它会抱怨

看,decltype(std::hex)in 参数字段被扣除到std::ios_base& (*)(std::ios_base&),而它被扣除到std::ios_base&(std::ios_base&)模板的参数中。

你能帮我理解吗?

0 投票
3 回答
418 浏览

c++ - 调用另一个翻译单元专用的函数模板

我正在开发一个使用以下结构的代码库:

啊:

一个.cpp:

b.cpp:

该代码似乎可以正确构建和运行。

我的问题是:这是格式正确的,还是某种格式错误的 NDR 恰好起作用?


如果使用clang -Wundefined-func-template (在我的 IDE 的默认 clang-tidy 设置中启用)构建,则会产生警告:

但我不确定是否只是禁用警告,或者进行一些代码更改(除了将显式专业化定义移动到头文件,这对于这个项目来说不是更可取的)。

遵循警告消息中的建议并向头文件(即extern template void f<1>();)添加显式实例化声明会导致错误消息(在显式实例化之前隐式实例化专门化)。

但是,向template<> void f<1>();头文件添加显式特化声明会抑制警告。但我不确定这是否是(a)必要的,和/或(b)推荐的风格。