繁体   English   中英

模板参数名称隐藏

Template parameter name hiding

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我最近被咬了(简化)

struct Base {
    typedef char T;
};

template<typename T>
struct Foo : Base {
    T x[50];  // This is Base::T, not the template parameter
};

换句话说,类成员名称隐藏模板参数(即使来自基类,因此在本地上下文中并不完全明显)。

然而,我做了一些实验,发现:

struct Base {
    typedef char T;
};

template<typename T, typename B>
struct Foo : B {
    T x[50];  // This T is the template parameter,
              // even passing Base as B
};

这个显然荒谬的规则背后的理由是什么(如果有的话)?

我能想到的唯一出路是给出丑陋的模板参数名称,也意味着在不使用保留名称的情况下安全地编写模板是不可能的(因为模板中使用的类可能会碰撞参数名称...请注意很多C ++代码使用uglyfied名称为私人成员)。

PS:我没有深入研究这个问题的标准,但是g ++和clang ++都同意这个行为,所以我认为这不是一个错误。

PPS:在实际代码中,隐藏的模板参数名为tid ,是一个整数而不是一个类型。 -Wall还不足以告知隐藏,我在用valgrind进行了几个小时的调试后发现了它。

1 个回复

此规则(在[temp.local] / 9中指定)是11年前创建的开放核心语言问题的主题 - 核心问题#459 CWG彻底讨论了这个问题。 关于意图,迈克米勒提到了这一点

当前规范的基本原理非常简单:

  • “除非在派生类中重新声明,否则基类的成员也被认为是派生类的成员。”(10 [class.derived]第2段)

  • 在类范围中,成员隐藏非成员。

而已。 因为模板参数不是成员,所以它们被成员名称隐藏(无论是否继承)。 我没有发现“奇怪”,甚至特别令人惊讶。

理由:

我们对改变有一些同情,但是当前的规则直接落在查找规则之外,因此它们并非“错误”。使私有成员不可见也会解决这个问题。 我们愿意看一篇提出这个问题的论文。[...]
如果没有更详细地探讨该问题的论文,CWG决定此时不考虑更改现有规则。

不幸的是,还没有写过这样的论文,所以规则一直持续到今天。

1 模板参数隐藏

ISO草案n3290第3.3.9节第4段的要点: 模板参数名称的声明性区域嵌套在立即封闭的声明性区域中。[注:结果,模板参数在封闭范围(3.3.10)中隐藏了具有相同名称的任何实体。 除了这个..哪里和哪里出现这种情况,任何人都可以....告诉其他例子 链接n3290草 ...

2 隐藏成员模板的模板参数

来自temp.local : 在出现在类模板定义之外的类模板成员的定义中,类模板成员的名称隐藏了任何封闭类模板的模板参数的名称( 但不是模板参数的名称)成员,如果成员是类或函数模板 )。 [例如: - 结束例子] 问题是,我尝试过的每个编译器(g ++,vc,i ...

3 模板函数名称作为模板参数?

我定义了一些模板函数,例如: 现在,我想创建函数指针的const数组。 我试图使用C ++ 11可变参数模板来构造这些数组: 该解决方案可以完美地工作。 主要功能将打印从0到7的列表。 现在我的问题是,我还有其他一些模板函数,并且我想编写一组模板工具来为每个这样的 ...

4 模板参数名称作为基类

我有以下几种类型: 此类型用于定义自定义内存管理器。 问题是类memory_algorithm将继承自另一个类,该类将始终采用表示memory_options类的template parameter ,我称之为options 。 基类可以是来自memory_track的部分特化或 ...

6 typedef和具有相同名称的模板参数

为什么这种情况不正确(这是合乎逻辑的) ,但那个案子是对的吗? 标准14.6.1 / 7说: 在类模板的定义中或在模板定义之外出现的这种模板的成员的定义中,对于不依赖于模板参数的每个基类(14.6.2),如果名称是基类或基类成员的名称与template-paramete ...

7 模板匹配参数的名称

在我的模板匹配代码中,我需要用户传递一个浮点参数,该参数指定算法是仅专注于最佳匹配(从而更快地工作)还是分析甚至是低概率区域(使其更慢)。 该参数是线性的并且已标准化,以使可能的值在&lt;0,1&gt;范围内。 随参数的增长而增加或减少匹配项的数量无关紧要,因为可以轻松更改。 默认值 ...

8 命名(或引用)一个专门的模板参数

我决定使用以下模式自动组合各种类型的对象及其配置: 它旨在防错和自动,但我无法避免将枚举值写入两次(这很容易出错且根本不是自动的)。 我想写一些类似的东西(所以我想以某种方式引用专用参数): 有什么技巧可以用来实现类似的目标吗? 先感谢您! 请在这里找到详细的代码(代码) ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM