- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这里给出了一个关于模板消歧器的问题:
在答案中我们可以读到:
ISO C++03 14.2/4
When the name of a member template specialization appears after . or -> in a postfix-expression, or after nested-name-specifier in a qualified-id, and the postfix-expression or qualified-id explicitly depends on a template-parameter (14.6.2), the member template name must be prefixed by the keyword template. Otherwise the name is assumed to name a non-template.
下面是我不太明白的具体例子:
template <class T>
class Base {
public:
template <int v>
static int baseGet() {return v;}
class InnerA {
public:
template <int v>
static int aget() {return v;}
};
class InnerB {
public:
typedef Base BaseType;
typedef BaseType::InnerA OtherType;
template <int v>
static int baseGet() {return BaseType::baseGet<v>();} //(A)
template <int v>
static int aget() {return OtherType::aget<v>();} //(B)
};
};
显然编译失败。你需要template
在 (B) 行中:OtherType::template aget<v>();
.但是,g++ (4.4.3) 和 clang++ (2.9) 都不会提示缺少 template
。在 (A) 行中。为什么? BaseType
取决于类型 T
,不是吗?是那些编译器偏离了标准,还是我误解了标准中的某些内容?
最佳答案
它们实现了 C++0x 规范,其中 Base
是当前实例化。而 C++0x 允许省略 template
在这种情况下的关键字。自 BaseType
是 Base
的类型定义,当你说 BaseType
,它也命名了当前的实例化。
引用规范,因为你似乎对规范引用感兴趣
A name is a member of the current instantiation if it is [...]
- A qualified-id in which the nested-name-specifier refers to the current instantiation and that, when looked up, refers to at least one member of the current instantiation or a non-dependent base class thereof.
和
A name refers to the current instantiation if it is [...]
- in the definition of a [...] nested class of a class template, [...], the injected-class-name (Clause 9) of the class template or nested class
和(您引用的修改后的 14.2/4)
[...] or the nested-name-specifier in the qualified-id refers to a dependent type, but the name is not a member of the current instantiation (14.6.2.1), the member template name must be prefixed by the keyword template. [...]
注意:在 C++03 中,您的代码格式错误,因为 BaseType
和 OtherType
是依赖的。规范说:
A type is dependent if it is [...]
- a template parameter
- a qualified-id with a nested-name-specifier which contains a class-name that names a dependent type
- a template-id in which either the template name is a template parameter or any of the template arguments is a dependent type
(注意 Base
等同于 Base<T>
,它是 Base
和 BaseType::InnerA
是依赖类型的基础)。
请注意,您引用中的“明确依赖”是一个准标准术语,最近才被删除(我相信是在 1996 年 12 月)。它基本上意味着(在这种情况下)限定符依赖的限定 ID 或类成员访问( a->x
/a.x
),其中 a
是依赖的。 “explicitly depends”从草案中删除后,它仍然潜伏在某些地方,甚至 C++0x 在 14.6.2p2 的注释中仍然提到“explicitly depends”:
the base class name
B<T>
, the type nameT::A
, the namesB<T>::i
andpb->j
explicitly depend on the template-parameter.
关于c++ - 模板的模板成员的消歧模板关键字 : when exactly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6456636/
我想在数据中心选择一个事件分区。通常我会使用以下语句: INVANTIVE> use 1552839 2> Exclamation itgendhb077: Error in Invantive Da
我认为我的可能是 git 子模块的最简单用例。 我有一个目录结构 --- --- --- --- 每个子目录都是一个 git 存储库。我只想跟踪在我的 中添加的不同 git
我正在尝试循环数据框中的特定数字列,目标是使用“cor.test”函数提取相关性和 p 值。 相关性在于计算线性关系一个分类变量,由针对每个特定数字列的 0 和 1 值组成。 到目前为止,这是我的代码
当我使用 Invantive Data Hub 从多个 Exact Online 公司下载数据时,我得到了重复的行,而我希望每个公司只有一行。 我使用以下查询: select gla.code ,
我们刚刚上线 https://ecotaksen.be 。 Exact 上的查询和更新运行良好,但安装生产许可证后出现错误 itgenobr001:找不到客户端。。 我的数据容器规范是: 使用具有相
为了遵守法规,我尝试从我的一些部门下载采购发票文件(PDF 文件),将它们保存在磁盘上以供存档。 我使用 Invantive 查询工具来执行此操作。我想知道使用哪个表以及如何仅针对采购发票文档导出这些
我想获取“S-1”之后的链接,而不是“S-1/A”之后的链接。我尝试了“.find_all(lambda tag: tag.name == 'td' and tag.get()==['S-1'])”,
当我尝试通过 Google Colaboratory 中的 Earthengine 命令行上传 .tfrecord 和 .json 文件时,它显示“TfRecord 摄取 list 必须具有一个具有一
Closed. This question is off-topic 。它目前不接受答案。 想改善这个问题吗? Update the question 所以它是堆栈溢出的 on-topic。 10年前
这里给出了一个关于模板消歧器的问题: template disambiguator 在答案中我们可以读到: ISO C++03 14.2/4 When the name of a member tem
我想在考虑时间间隔的同时进行病例对照匹配。如果对照观察的自变量 X1、X2 和重叠时间间隔 X3 与一个案例具有相同的值,我想要一个匹配项。 例如,假设以下 df1: row Y X1 X2
我在这里有一个具有这种起始样式的 HTML 元素: transition: transform 2s; 首先是动画 (它旋转X)通过点击添加的类。下次单击时,将添加另一个类,该类添加了 transfo
我忘了,但是 EAGL 代表什么具体的东西吗?或者它只是核心动画 OpenGL 命名约定的一部分(CAEAGLLayer 等)? 最佳答案 “AGL”是苹果 OS X 的 OpenGL 扩展的名称。我
我们目前正在尝试优化复杂的 Angular 应用程序(性能和包大小)。 我们发现我们有部分未使用的组件,但我们不能 100% 确定它们。无论如何......我们目前要问的问题是,摇树在 Angular
我正在解决简单的优化问题。该数据集有 26 列和 3000 多行。 源代码看起来像 Means <- colMeans(Returns) Sigma <- cov(Returns) invSi
我让 Android Studio 将我的代码转换为 OnClickListener . 显然这里使用了 lambda。我不知道 lambda 是传递给 View 类的函数还是传递给 OnClickL
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 3 年前。 Improve th
关于“转换”的可用(类似)问题并没有真正阐明这是什么或做什么(顺便说一下,刚开始进行 Android 编程)。人们在哪里以及如何注意到“类型转换”的效果? 有什么区别: Button b = (But
我需要创建一个列,其中可以存储“0.0 - 99.99”之间的值。为什么?由于这种情况: 我的数据库中有这个表: "CREATE TABLE dumps( id INT
我正在摸不着头脑,经过一天的互联网搜索,我决定问你这个问题。 我有一个包含 2 个字段 tag_id 和 tag 的表 TAG,我试图将 TAG 的记录与特定字符串完全匹配,但我无法完全匹配,只能部分
我是一名优秀的程序员,十分优秀!