问题标签 [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.
c++ - 具有不同的类模板特化,并且特化定义在其签名中具有其他特化的功能
所以我有一个类模板,例如
模板.h
我将float
和double
专业化分成不同的 .h 文件
浮动.h
和
双倍.h
我在我的文件中按顺序包含了这三个文件.cpp
,它工作正常
但我需要向float
以Something作为参数的专业化添加另一个函数
然后包含Double.h
aftertemplate.h
并且它可以工作,但是当我尝试在其中执行相同操作Double.h
并添加一个接受或返回Something<float>
并包含float.h
after的函数时tempalte.h
。它给了我很多关于重新实例化的错误
我不太明白我猜想的问题是,可能在函数签名中对模板进行专门化会实例化模板,然后当它尝试在定义中再次实例化它时,它给出“已定义错误”但我不不知道如何解决这个问题,因为我需要有引用其他专业的函数
我正在使用 Visual Studio Community 2019 版本 16.11.6
c++ - C ++:基于另一个方法的重载实例化模板方法
我有一个方法(在 A 类中)有很多不同的重载,我正在创建一个从 A 继承的 B 类,改变方法的行为以在执行它最初的操作之前执行某个操作。问题是必须对所有重载进行此更改,这可以使用模板来完成。
实际上这确实有效,但是使用模板意味着将方法的新代码放在类声明中(即在标题中),这有点乱,我觉得必须有一种方法来放置代码在一个单独的文件中。有一种方法可以做到这一点,那就是将重新定义的方法 B::method() 的代码移动到一个单独的文件中,并为每个重载手动实例化它。如果重载的数量变大,这会很乏味,而且感觉很不自然。所以,因此我的问题是:有没有办法直接告诉编译器为它有效的每种类型实例化模板方法 B::method() ?(即对于每个类型 A::method 都被重载)
c++ - 函数模板内部的 C++ 函数重载解析取决于函数是否在命名空间中定义?
以下代码编译良好:
但是如果我在命名空间中定义 f()s,例如通过取消注释上述代码,那么编译器会生成一个错误:
这是为什么?
c++ - 完整类上下文中的实例化点
这在当前的 GCC、Clang、MSVC 和 ICC(https://godbolt.org/z/dvExbxszn)上编译。
我想知道这是否实际上指定在标准中工作。A<B>
具体来说,允许B::U
和B::V
被查找的实例化点在哪里?
如果我们使用//2
而不是//1
,所有四个编译器都会拒绝代码,但如果//X
被删除则接受。对于这种情况,我理解严格阅读标准可能会使程序格式错误,即使//X
被删除,因为实例化点应该高于B
. 然而,按照CWG 287中的建议更改,编译器允许查找A::U
在需要实例化的点之前声明的A<B>
.
但是,需要从完整的类上下文中进行实例化,在void f() { A<B> a; }
我看来,编译器假定实例化点在 的定义之后B
,因此其中的所有名称B
都可用于在实例化中查找。这实际上是在标准中指定的,还是类似于 CWG 287 的情况,编译器试图使实例化的行为类似于非模板定义,反对对标准的严格解释?
c++ - 无法在 MSVC 1930+ (Visual Studio 2022) 的常量上下文中使用模板函数类型
当我有这样的函数模板时:
我不能在最新的 MSVC 编译器的常量上下文中使用它的实例化:
您可以在编译器资源管理器中自己测试它。
它适用于较旧的 MSVC 版本以及 GCC 和 Clang。它是编译器错误,还是预期的行为?