问题标签 [name-hiding]

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 投票
2 回答
180 浏览

c++ - 在 C++14 中继承模板化 operator=:g++ 和 clang++ 的不同行为

我有这个代码可以按预期与 GCC 9.1 一起工作:

(在实践中,我们会在 中做一些花哨的事情B::operator=,甚至对 使用不同的类型特征enable_if,但这是最简单的可重现示例。)

问题是 Clang 8.0.1 给出了一个错误operator=,尽管孩子有using A<T>::operator=;

根据标准,哪个编译器是正确的?(我正在编译-std=c++14。)我应该如何更改代码以使其正确?

0 投票
2 回答
49 浏览

c++ - 关于派生类在基中实现的C++调用虚函数的问题

以下代码有什么问题?

我收到以下错误消息的编译错误

0 投票
1 回答
85 浏览

c++ - 纯虚类(A)派生的指针不能访问纯类(B)的重载方法

考虑我有两个纯虚拟类,一个从另一个派生,一个从最后提到的派生的具体类:

当我创建类型的指针时,Abstract2*我无法从Abstract1.

我收到以下错误,说唯一存在的方法是Absctract2重载:

有谁知道它为什么会发生或如何解决它?我的意思是,我得到的唯一合理的解决方案是添加

课内Abstract2

这是“隐藏姓名”的情况吗?为什么只在指针上而不是在具体类上呢?参数个数不同不仅是close类型的东西。

这是创建示例的在线玩的链接: https ://godbolt.org/z/gxKpzN

0 投票
0 回答
105 浏览

c++ - 如何使派生类中的所有隐藏名称都可以访问?

从这个问题开始:

考虑到这个简化的代码:

我有两个疑问。1. 我知道如果我从with 中“导入”一个method名称,我可以解决这个错误Abstract

但随后我导入了该名称的所有重载。 是否可以仅导入给定的重载? (假设Abstract有不止一个重载,例如:)

  1. 是否可以一次导入所有 (public|protected|all) 名称Abstract而不一一列出?

(现在假设除了methodAbstract还有:)

0 投票
4 回答
609 浏览

c++ - C++ 使用参数包的声明

我想定义一个从一堆类继承但不隐藏这些类的某些特定方法的类。

想象一下下面的代码:

现在的问题是,如果只有一个类没有同名的成员,DoSomething我会收到错误消息。我已经尝试过使用宏和 SFINAE 模拟“忽略如果未定义使用”,但要处理所有情况,这变得非常大而且丑陋!你有什么想法来解决这个问题吗?

如果我能定义:“嘿,使用 - 忽略缺失的成员”,那就太好了。

这里我有一些示例代码:Godbolt

0 投票
1 回答
223 浏览

c++ - C++ 继承重载具有不同参数的函数

我正在开发一个使用类继承并且在基类和派生类中都需要大量重载的项目,我已经简化了代码,但我不想不必要地复制和粘贴,因为这应该是继承的用途。

0 投票
0 回答
59 浏览

c++ - 使用 clang,派生类中的模板方法会隐藏具有相同名称的父方法,即使被 SFINAE 禁用,甚至使用 using-declaration

请看一下这个小示例代码

它用 gcc 和 icc 编译得很好,它不能用 clang 编译,它抱怨如下:

好像没有using-declaration添加到struct derived. 如果我不使用模板,我肯定知道这将是 clang 的问题。但是,我不确定我正在使用模板这一事实,而 SFINAE 意味着必须使用不同的规则,所以这是我的问题:哪个编译器是正确的?Clang,还是 gcc 和 icc?

这是关于 Godbolt 问题的一个工作示例:https ://godbolt.org/z/xv98SP

0 投票
2 回答
71 浏览

c++ - 隐藏在 C++ 中的函数

我正在尝试一些隐藏在 c++ 中的函数概念。因此,在派生类中,我使用范围解析运算符 using base::fun来提供派生类中基类的范围。我的目标是打印cout<<" base "<< x;,但输出只打印派生类 cout。有什么原因以及如何解决?即它应该打印基类和派生类的值。我是 C++ 新手,如有任何错误,我深表歉意。代码如下所示:

0 投票
1 回答
127 浏览

c++ - 可变参数函数重载和 SFINAE - 解决歧义以模拟“隐藏签名”

我想在 C++ 中使用“按签名隐藏”而不是“按名称隐藏”。所以我写了一个宏,它定义了一个可变参数函数,如果存在的话,它将所有调用委托给它的基类。我不能使用 using 声明,因为如果基类没有具有该名称的方法,我不希望它失败 - 并且只有在没有直接成员匹配时才应考虑继承的方法。这在大多数情况下都有效,因为它是由可变参数函数实现的,与非可变参数函数相比,它总是更差的候选者。但是当子类也具有可变参数函数时,我遇到了问题->调用变得模棱两可。

所以我得到以下情况(简化 - 没有sfinae,宏......):

在godbolt上看到它。

我想在不将其中一种方法设为“调度程序方法”的情况下解决这种情况。有没有办法让一种方法成为解决这种歧义的“更糟糕的候选者”?


更新

似乎不清楚我真正想要实现的目标。所以这里有一些带有注释的“伪代码”:


更新

我想从你这里得到类似的东西,如何让普通函数成为变差函数的更差候选者。

例如:

有什么东西可以使可变参数功能变得更糟吗?

背景:目前我有以下宏,只是为了模拟我想要的使用。

它适用于“正常”功能 - 但“宏生成功能”并不被认为更糟......

0 投票
1 回答
56 浏览

c++ - 名称隐藏和覆盖 - 有没有办法使函数显式不覆盖

我想隐藏一个虚拟方法而不是覆盖。我知道出于历史/兼容性原因,覆盖说明符是可选的,并且覆盖是隐式发生的。为了停止覆盖,我通常通过添加默认的“虚拟”参数来调整签名。有没有更好的办法?

假设这段代码:

到目前为止我所做的是: