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

c++ - 具有不同的类模板特化,并且特化定义在其签名中具有其他特化的功能

所以我有一个类模板,例如

模板.h

我将floatdouble专业化分成不同的 .h 文件

浮动.h

双倍.h

我在我的文件中按顺序包含了这三个文件.cpp,它工作正常

但我需要向float以Something作为参数的专业化添加另一个函数

然后包含Double.haftertemplate.h并且它可以工作,但是当我尝试在其中执行相同操作Double.h并添加一个接受或返回Something<float>并包含float.hafter的函数时tempalte.h。它给了我很多关于重新实例化的错误

我不太明白我猜想的问题是,可能在函数签名中对模板进行专门化会实例化模板,然后当它尝试在定义中再次实例化它时,它给出“已定义错误”但我不不知道如何解决这个问题,因为我需要有引用其他专业的函数

我正在使用 Visual Studio Community 2019 版本 16.11.6

0 投票
1 回答
26 浏览

c++ - C ++:基于另一个方法的重载实例化模板方法

我有一个方法(在 A 类中)有很多不同的重载,我正在创建一个从 A 继承的 B 类,改变方法的行为以在执行它最初的操作之前执行某个操作。问题是必须对所有重载进行此更改,这可以使用模板来完成。

实际上这确实有效,但是使用模板意味着将方法的新代码放在类声明中(即在标题中),这有点乱,我觉得必须有一种方法来放置代码在一个单独的文件中。有一种方法可以做到这一点,那就是将重新定义的方法 B::method() 的代码移动到一个单独的文件中,并为每个重载手动实例化它。如果重载的数量变大,这会很乏味,而且感觉很不自然。所以,因此我的问题是:有没有办法直接告诉编译器为它有效的每种类型实例化模板方法 B::method() ?(即对于每个类型 A::method 都被重载)

0 投票
1 回答
42 浏览

c++ - 函数模板内部的 C++ 函数重载解析取决于函数是否在命名空间中定义?

以下代码编译良好:

但是如果我在命名空间中定义 f()s,例如通过取消注释上述代码,那么编译器会生成一个错误:

这是为什么?

0 投票
0 回答
144 浏览

c++ - 完整类上下文中的实例化点

这在当前的 GCC、Clang、MSVC 和 ICC(https://godbolt.org/z/dvExbxszn)上编译。

我想知道这是否实际上指定在标准中工作。A<B>具体来说,允许B::UB::V被查找的实例化点在哪里?

如果我们使用//2而不是//1,所有四个编译器都会拒绝代码,但如果//X被删除则接受。对于这种情况,我理解严格阅读标准可能会使程序格式错误,即使//X被删除,因为实例化点应该高于B. 然而,按照CWG 287中的建议更改,编译器允许查找A::U在需要实例化的点之前声明的A<B>.

但是,需要从完整的类上下文中进行实例化,在void f() { A<B> a; }我看来,编译器假定实例化点在 的定义之后B,因此其中的所有名称B都可用于在实例化中查找。这实际上是在标准中指定的,还是类似于 CWG 287 的情况,编译器试图使实例化的行为类似于非模板定义,反对对标准的严格解释?

0 投票
0 回答
37 浏览

c++ - 无法在 MSVC 1930+ (Visual Studio 2022) 的常量上下文中使用模板函数类型

当我有这样的函数模板时:

我不能在最新的 MSVC 编译器的常量上下文中使用它的实例化:

您可以在编译器资源管理器中自己测试它。

它适用于较旧的 MSVC 版本以及 GCC 和 Clang。它是编译器错误,还是预期的行为?