问题标签 [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.
c++ - 使用模板`using`声明有什么问题
以下使用模板using
声明有什么问题?
gcc 4.8.2
抱怨:
c++ - 使用详细类型说明符创建隐藏类的对象
我有以下代码片段:
以下语句根据第 3.3.10 节隐藏类 A::X
但是应该使用 Elaborated 类型说明符访问类,并且以下语句应该完美地创建一个对象:
但它给出了错误:
在函数“int main()”中:38:13:错误:聚合“main()::X x”类型不完整,无法定义
现场演示 - http://cpp.sh/4bm4
这里有什么问题??
我是不是误会了什么??
c++ - 使用声明对两个完全相同名称的名称查找的影响
基本上,我的问题与名称查找和using
声明有关(http://en.cppreference.com/w/cpp/language/namespace)。
假设我们有以下(绝对是愚蠢的)代码:
因此,我的理解是现在我们应该让两个名称都可见,然后对于名称查找,应该有一些歧义。但实际上并非如此。是什么原因,或者换句话说,我误解了一些概念吗?
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...>
。
据我所知,该片段应该编译。我错了吗?
c++ - 'using' 关键字从多个虚拟继承函数中进行选择
我有一个类('TestC'),它派生自另外两个类('TestA' 和'TestB'),它们都有一个具有相同签名的虚函数。
为了使该功能可以通过“TestC”访问,我必须告诉它要使用哪个版本。如果我明确覆盖“TestC”中的函数并调用我想要的版本,则此方法有效:
输出:“bb”
这就是预期的结果。但是,我注意到如果我使用 'using' 关键字,而不是显式地覆盖函数,我会得到一些意想不到的行为:
(其他都一样)
输出:“ab”
谁可以给我解释一下这个?看起来“测试”突然不再是虚拟的了?有没有办法做到这一点,而无需显式覆盖函数?(类似于“使用覆盖”)
c++ - 使用声明的奇怪行为
请看下面的代码
所有 gcc 6.1、clang 3.8 和 msvc 2015 update 3 都拒绝编译它,因为A
它不是内部的可访问名称,C
因为A
它是B
. 似乎 gcc 认为A
inusing base_type = A
指的是A
. msvc 和 clang 似乎没有。
也许编译错误是由于继承触发的名称注入(因为修改using base_type = A
为using base_type = ::A
使所有编译器都能正常工作),但我想知道这个奇怪的错误是否是标准所说的。
更具体地说,
- 据我了解, not like
A::type
只是A
一个类名(尽管 gcc 将其误解为函数名),它被引入C
not insideA
norB
。为什么这个名字被认为是私有的B
? - 这个编译错误应该被认为是一个错误,还是标准规范的边缘情况?
c++ - using-declaration 无法正常工作
在下面的示例中,我试图通过在课堂上将其设为私有来隐藏using Employee::showEveryDept
最后一个子类-Designer
Elayer
但它仍在编译,输出是 -
但我已明确将其设为私有,请参阅 -private: using Employee::showEveryDept;
我在这里做错了什么?
c++ - 在命名空间中使用指令导致的错误示例
我试图了解using
在命名空间中包含声明会产生什么样的错误。我正在考虑这些 链接。
我正在尝试创建一个示例,其中由于使用using
声明,名称被静默替换为在另一个文件之前加载的头文件而导致错误。
我在这里定义MyProject::vector
:
这是“坏”的标题:在这里,我试图using
隐藏其他可能的vector
inside定义MyNamespace
:
这是试图使用的毫无戒心的标头MyProject::vector
,定义base.h
如下:
最后是实现文件,包括x.h
和z.h
:
如果我包含using std::vector
in x.h
,则会发生实际编译错误,告诉我在使用vector
in时必须指定模板参数z.h
,因为x.h
成功地隐藏了vector
inside的定义MyProject
。这是一个很好的例子,说明为什么using
不应该在头文件中使用声明,或者事情比这更深入,我错过了更多?
但是,如果我包含using namespace std
in x.h
,则不会发生阴影,并且程序编译得很好。这是为什么?不应该using namespace std
加载所有可见的名称std
,包括vector
,从而遮蔽另一个?
c++ - 使用别名时未检测到名称冲突
这是对这个问题的跟进。考虑以下示例:
在这里,编译器在该行正确地抛出了一个错误using Other::string
,抱怨该string
命名空间中已经存在一个来自先前class string
定义的声明。
现在考虑一下:
这里没有编译错误:我成功地string
用一个新的声明隐藏了我之前的声明。
为什么第二种情况没有错误?是不是因为
using string = something
is not an actual declaration,因为它是别名,而真正的声明是针对something
名称的,编译器只能发现实际声明之间的冲突,所以在这种情况下,它会认为我真的在声明something
andstring
,并且是可以吗?这不是很危险吗?我的意思是,如果这些事情在程序员没有意识到的情况下发生在单独的头文件中,他/她最终可能会使用一个可能与他/她认为的完全不同的标识符,并且编译器不会说任何东西......