问题标签 [using-declaration]

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 回答
47 浏览

c++ - 使用模板`using`声明有什么问题

以下使用模板using声明有什么问题?

gcc 4.8.2抱怨:

0 投票
0 回答
51 浏览

c++ - 使用详细类型说明符创建隐藏类的对象

我有以下代码片段:

以下语句根据第 3.3.10 节隐藏类 A::X

但是应该使用 Elaborated 类型说明符访问类,并且以下语句应该完美地创建一个对象:

但它给出了错误:

在函数“int main()”中:38:13:错误:聚合“main()::X x”类型不完整,无法定义

现场演示 - http://cpp.sh/4bm4

这里有什么问题??

我是不是误会了什么??

0 投票
2 回答
140 浏览

c++ - 使用声明对两个完全相同名称的名称查找的影响

基本上,我的问题与名称查找和using声明有关(http://en.cppreference.com/w/cpp/language/namespace)。
假设我们有以下(绝对是愚蠢的)代码:

因此,我的理解是现在我们应该让两个名称都可见,然后对于名称查找,应该有一些歧义。但实际上并非如此。是什么原因,或者换句话说,我误解了一些概念吗?

0 投票
1 回答
401 浏览

templates - using 声明引用到 C,它是 D 的基类(别名),但它不被识别为有效

这看起来像是 clang 中的一个问题(我已经打开了一个bug 到 clang),但我想确定我没有做错。

考虑以下代码:

第 (2) 行(如果注释掉 (1) 和 (4))和 (3)(如果注释掉 (4))按预期工作,而 (1)(上面的示例)给出以下错误:

11:错误:
使用 C::D 解析为没有“typename”的依赖使用声明;

[...]

11:错误:使用声明引用'C::',它不是'D'的基类,
使用C::D;

无论如何,C是 的别名D<U, A...>,即 的基类D<T, U, A...>
据我所知,该片段应该编译。我错了吗?

请注意,GCC 至少从v4.8.1v6.1编译它。

0 投票
2 回答
1337 浏览

c++ - 'using' 关键字从多个虚拟继承函数中进行选择

我有一个类('TestC'),它派生自另外两个类('TestA' 和'TestB'),它们都有一个具有相同签名的虚函数。

为了使该功能可以通过“TestC”访问,我必须告诉它要使用哪个版本。如果我明确覆盖“TestC”中的函数并调用我想要的版本,则此方法有效:

输出:“bb”

这就是预期的结果。但是,我注意到如果我使用 'using' 关键字,而不是显式地覆盖函数,我会得到一些意想不到的行为:

(其他都一样)

输出:“ab”

谁可以给我解释一下这个?看起来“测试”突然不再是虚拟的了?有没有办法做到这一点,而无需显式覆盖函数?(类似于“使用覆盖”)

0 投票
2 回答
1222 浏览

c++ - 使用声明的奇怪行为

请看下面的代码

所有 gcc 6.1、clang 3.8 和 msvc 2015 update 3 都拒绝编译它,因为A它不是内部的可访问名称,C因为A它是B. 似乎 gcc 认为Ainusing base_type = A指的是A. msvc 和 clang 似乎没有。

也许编译错误是由于继承触发的名称注入(因为修改using base_type = Ausing base_type = ::A使所有编译器都能正常工作),但我想知道这个奇怪的错误是否是标准所说的。

更具体地说,

  1. 据我了解, not likeA::type只是A一个类名(尽管 gcc 将其误解为函数名),它被引入C not inside A nor B。为什么这个名字被认为是私有的B
  2. 这个编译错误应该被认为是一个错误,还是标准规范的边缘情况?
0 投票
2 回答
212 浏览

c++ - 在“T”是模板类型参数的情况下,是否允许“使用 Base::operator T”?

考虑这个例子:

GCC接受代码,而Clang和 MSVC 拒绝它。哪个是对的?

请注意,如果基类型是依赖的,则所有编译器都接受以下代码:

0 投票
5 回答
1006 浏览

c++ - using-declaration 无法正常工作

在下面的示例中,我试图通过在课堂上将其设为私有来隐藏using Employee::showEveryDept最后一个子类-DesignerElayer

但它仍在编译,输出是 -

但我已明确将其设为私有,请参阅 -private: using Employee::showEveryDept;

我在这里做错了什么?

0 投票
1 回答
161 浏览

c++ - 在命名空间中使用指令导致的错误示例

我试图了解using在命名空间中包含声明会产生什么样的错误。我正在考虑这些 链接

我正在尝试创建一个示例,其中由于使用using声明,名称被静默替换为在另一个文件之前加载的头文件而导致错误。

我在这里定义MyProject::vector

这是“坏”的标题:在这里,我试图using隐藏其他可能的vectorinside定义MyNamespace

这是试图使用的毫无戒心的标头MyProject::vector,定义base.h如下:

最后是实现文件,包括x.hz.h

如果我包含using std::vectorin x.h,则会发生实际编译错误,告诉我在使用vectorin时必须指定模板参数z.h,因为x.h成功地隐藏了vectorinside的定义MyProject。这是一个很好的例子,说明为什么using不应该在头文件中使用声明,或者事情比这更深入,我错过了更多?

但是,如果我包含using namespace stdin x.h,则不会发生阴影,并且程序编译得很好。这是为什么?不应该using namespace std加载所有可见的名称std,包括vector,从而遮蔽另一个?

0 投票
0 回答
71 浏览

c++ - 使用别名时未检测到名称冲突

这是对这个问题的跟进。考虑以下示例:

在这里,编译器在该行正确地抛出了一个错误using Other::string,抱怨该string命名空间中已经存在一个来自先前class string定义的声明。

现在考虑一下:

这里没有编译错误:我成功地string用一个新的声明隐藏了我之前的声明。

  • 为什么第二种情况没有错误?是不是因为using string = somethingis not an actual declaration,因为它是别名,而真正的声明是针对something名称的,编译器只能发现实际声明之间的冲突,所以在这种情况下,它会认为我真的在声明somethingand string,并且是可以吗?

  • 这不是很危险吗?我的意思是,如果这些事情在程序员没有意识到的情况下发生在单独的头文件中,他/她最终可能会使用一个可能与他/她认为的完全不同的标识符,并且编译器不会说任何东西......