问题标签 [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 投票
0 回答
120 浏览

c++ - 定义中的显式特化导致错误:非命名空间范围内的显式特化

explicit specialization in non-namespace scope从这个定义中得到错误:

这是使用定义的方式,这会触发错误:

我相信我得到这个定义没有命名空间范围。这适用于clang,但不适用于GCC。如何在命名空间范围内实现相同的功能?

0 投票
1 回答
108 浏览

c++ - 派生类模板的显式特化

我有一个实现许多功能的类模板。当声明特定类型时,我还希望能够添加此类的专用版本,该版本只有少数功能覆盖基类的功能。我知道我可以通过一个类模板和它的显式特化来实现这一点。但是我也想:

  • 具有唯一命名的显式特化,类似于如何唯一命名基类和派生类。
  • Base从实例化Derived对象调用函数,无论是在Derived函数内部,还是如下所示显式调用obj1.Foo

这是我试图使工作的(简化)示例代码:

在 myClasses.h

在 myClasses.cpp

在 main.cpp

但是,此代码因explicit specialization of non-template Derived错误等而失败。我已经阅读了很多 StackOverflow 线程来让我走到这一步,但我还没有找到任何可以帮助我进行编译的东西。所以我的问题是:

  1. 是否可以通过这种方式将类模板与类继承结合起来?
  2. 尽管我明确使用该关键字,为什么编译器仍将派生类标记为非模板?
  3. 使此代码工作的正确语法是什么?(假设我正在尝试做的事情是可能的)

编辑:按照 HTNW 的建议,我可以通过删除前缀Derived变成普通类。template<>这将允许一切编译到obj1.Foo(input). 实例化的 Derived 类似乎无法找到或访问基 Foo 函数。

0 投票
0 回答
174 浏览

c++ - 类中的显式专业化:Clang 和 GCC 之间的区别

下面的代码在 Clang 中编译并正常工作,但在 GCC 中它给出了错误:

<source>:9:14: error: explicit specialization in non-namespace scope 'class DecideType<A, B>'

只需添加一些额外的、未使用的模板参数,就可以很容易地为 GCC 修复代码。

哪个编译器是正确的,为什么?我发现了一个更改提案,建议自 C++17 以来在这种情况下应该允许完全专业化,但我不知道这是否正式在标准中。https://wg21.cmeerw.net/cwg/issue727

如果 GCC 是正确的,为什么部分专业化和显式专业化之间存在这种差异?毕竟,显式特化只是部分特化的特例。

编辑 0

有一个 C++17 的错误报告https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85282。我认为它被拒绝了,但据我所知,这似乎还没有定论。我不知道它是否可以得出关于 C++20 的任何结论。

0 投票
1 回答
99 浏览

c++ - OpenGL——非命名空间范围内的显式特化——函数模板

最近我从 YouTube 学习 OpenGL 基础知识,当我使用 VS C++ 编译器时,一切都像一个魅力,但自从我搬到 Clang 后,我从下面的代码中收到错误“非命名空间范围内的显式专业化”:

*这是一个不完整的类定义,但我想让这段代码更清晰。

基本上,我想要的只是创建几个函数,每个类型都有一个(我是模板的新手:D)。我将 Clion 与 MinGW64 Clang 和 C++20 一起使用。

我知道 VS C++ 编译器添加了一个非标准特性来支持这一点,而 Clang 只使用标准方法。

谁能告诉我解决方法?

编辑1:

尝试从 Yakov Galka 的回答中实施第一个解决方案。我猜这两个 [[nodiscard]] 行或 m_Stride 变量可能会搞砸。我收到错误“多重定义”。

(这次完整的代码)我应该从一开始就这样发布它。

在这种情况下,正确的实现是什么?

0 投票
1 回答
86 浏览

c++ - C++: specializing member requires template<> syntax

I am trying the following...

When I am trying to do the following in visual studio, it works fine.. But when I compile using g++, it fails with specializing member ‘Singleton<ABC>::ptr’ requires ‘template<>’ syntax. What I am missing here?

0 投票
1 回答
70 浏览

c++ - 如何显式实例化没有参数的 func 模板?

我有一个成员函数模板如下:

当我编译它时,我得到链接错误,所以我添加了一些它们的显式实例化。

编译器错误信息:

/usr/include/c++/9/variant:在 'constexpr const _Tp& std::get(const std::variant<_Types ...>&) [with _Tp = signed char; _Types = {bool, double, int, std::__cxx11::basic_string<char, std::char_traits, std::allocator >}]': Argument.cpp:57:16: 来自'T octopus::Argument_t: :as(const octopus::Argument_t&) const [with T = signed char]' Argument.cpp:67:53: 这里需要 /usr/include/c++/9/variant:1078:42: 错误: 静态

断言失败:T 应该在备选方案中只出现一次

为什么我得到这个?如何解决?

0 投票
2 回答
220 浏览

c++ - 是否有规定在函数模板显式特化中指定对“返回类型”的限制?

考虑这个例子,它被所有实现拒绝。但是,我在当前标准中没有找到任何有说服力的条款来指定这个明确的专业化声明是格式错误的。如果存在,规则是什么?

此外,潜在的相关规则可能是 [temp.deduct.decl#2]

如果对于这样考虑的一组函数模板,在考虑了偏序([temp.func.order])之后没有匹配或有多个匹配,则推导失败,并且在声明的情况下,程序有问题-形成。

我认为“匹配”的含义在这里不够清楚,因为“匹配”没有明确定义任何东西。

0 投票
0 回答
25 浏览

c++ - 仅在模板类中为双精度类型添加函数模板特化

我有一个带有基类的类模板的实现。

在 cpp [从课堂上移出]:

我想为 getErrorPercent、getFotmattedText 和 getErrorPercentageStr 添加函数模板专门化,仅用于双精度类型。

对于 getErrorPercent 我想:

对于 getFotmattedText 我想:

double 的 getErrorPercentageStr 函数将计算误差 [m_measured and m_expected will be doubles] 并将其作为字符串返回。对于所有其他类型,它将返回一个空字符串。

我一直在寻找解决方案,但无法编译或调用正确的 double 函数。

我如何/在哪里放置函数的专用版本?我不认为我可以把这些放在课堂上。

在 h 或 cpp 文件中?

我可以在课堂上留下函数[非专业]的主要实现吗?

我是否需要将原型放在某个特定功能的地方?

然后在cpp中实现?

我尝试了这个并为 MyClass::getFormattedText() 和 MyClass::getErrorPercent() 的 int 版本获得了很多“未解析的外部符号”。也适用于 bool、unsigned int 和 std::basic_string 版本。所有这些都应该使用默认版本。

我该如何解决这些问题?

我确实让它使用“if constexpr (std::is_same_v<T, double>)”来处理它,但这无法用 vxWorks 编译。抱怨 << for double in getErrorPercentageStr where "rep << difference << "V";"。

错误:'operator<<' 不匹配(操作数类型为 'std::ostringstream' 和 'double')

任何帮助将不胜感激!