问题标签 [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 投票
3 回答
803 浏览

c++ - 继承和隐藏父属性

做这样的事情合理吗?

注意:这是一个最小的工作示例

我知道我不能简单地隐藏一个函数,因为这会违反 Liskov 原则,但是进行private继承并再次指定所有公共方法似乎真的是多余的。

这两个类必须有一个共同的父类(即使它直接是其中之一),并且不能x直接修改。

using奖金:有人可以指出我在这种情况下定义确切行为的地方吗?我尝试用谷歌搜索它,但收效甚微。

0 投票
1 回答
101 浏览

c++ - 包含和使用声明

这两个声明是什么意思?

是否有任何好的教程可以深入说明 using 指令/声明?谢谢。

0 投票
2 回答
320 浏览

c++ - “使用声明”在 RADStudio 2010 中不起作用

我正在从 VCL 类派生一个新TStream类:

TStream声明了 Seek 的以下两种变体:-

但是在编译我的课程时我收到以下 W8022 警告:-

当然 Using 声明应该解决这个问题?

为了将这个问题拖回正轨,我知道两个版本的 TStream::seek 相互关联的方式,我只是想获得派生类公开的继承 Seek(int,int) 方法。为什么我的using声明不这样做?

0 投票
1 回答
1077 浏览

c++ - 在不同的命名空间中调用别名声明的基类构造函数

我试图通过 C++11 了解别名声明类的一些细节,using以及这如何/为什么会影响基类构造函数调用。

示例代码

gcc 4.7.2(使用 -std=gnu++11 编译)为此代码生成两个我认为相关的错误(尽管我不明白如何......)

错误 1

我在 stackoverflow 上的搜索是在引用基类时需要命名空间,其中提到注入的类名作为进一步搜索的起点。但是,根据我收集到的信息,这解释了为什么我可以A按照我的方式编写构造函数(即 as A(int i=42):BarInt(i){};)以及为什么BarInt(i)不必使用 namespace 来限定N

那么为什么这不起作用B呢?根据 C++11 中的'typedef'和'using'有什么区别?,using与 good old 相同typedef,所以我想我对第一个错误的问题是,在注入类名的上下文中,别名声明的类(BarFloat在我的示例中)与常规类(在我的示例中)有何不同。BarInt任何指针都非常感谢:)

错误 2

Foo()如果我在上面的示例代码中已经指出,引入一个空的构造函数,这个错误就会消失。然而,我的问题是为什么BarFloat(f)会触发对空Foo()构造函数的调用,在这种情况下,如何BarFloat.value可能将其设置为 23.0.0。

后经

因为这是我在这里的第一篇文章:您好 stackoverflow,感谢大家通过帮助他人解决问题为我提供的巨大帮助!

0 投票
1 回答
1789 浏览

c++ - typedef 和 using 声明在同一范围内的同名

我搜索了 C++11 标准(嗯,n3242 草案)和互联网,但找不到准确的答案。下面的代码在 clang 3.2 和 g++ 4.7.2 以及 Visual Studio 2010 中编译得很好,但我希望得到一个错误。

内置:

clang 和 g++ 生成的可执行文件打印“i”,这似乎表明a是 int 类型并且 typedef 占了上风。cl 生成的可执行文件打印“class a_ns::a_t”,这似乎表明 Visual Studio 更喜欢 using 声明。

我希望代码不会根据以下标准摘录进行编译。我预计会出现类似于“使用声明的目标与范围内的声明冲突”的错误。

7.1.3.6 类似地,在给定范围内,类或枚举不应使用与在该范围内声明的类型定义名称相同的名称来声明,并且该名称引用类或枚举本身以外的类型。

7.3.3.1 using-declaration 将名称引入到 using-declaration 出现的声明性区域中。

7.3.3.2 每个使用声明都是一个声明 [...]

标准中可能缺少一些东西来解释这种行为(或者我太累了,看不到明显的东西),但我似乎找不到它。

谢谢你。

0 投票
1 回答
210 浏览

c++ - 具有相同签名的模板不会导致编译器错误

以下程序在两个单独的命名空间 (和)中定义了两个函数模板A::foo<>()和。这两个函数模板的签名相同,只是分配给它们的第二个模板参数的默认参数不同。最终,它们的名称被相应的一对声明带入了范围:B::foo<>()ABmain()using

我希望第二个using声明在这里会导致编译错误:毕竟,当我尝试在同一个命名空间中定义这两个模板时,我会得到这样的结果。

令我惊讶的是,我尝试过的每个编译器(GCC 4.7.2、GCC 4.8.0 beta、ICC 13.0.1、Clang 3.2)都会编译程序并调用A::foo().

问题#1:这是正确的吗?这可能是“不需要诊断”的情况吗?鼓励参考 C++11 标准。


现在考虑上述程序的这种变体,它基本上使用类而不是命名空间来实现相同的效果:

该程序也可以在上述所有编译器上编译,而我预计第二个using声明会导致编译器错误。

问题#2:这是正确的吗?这可能是“不需要诊断”的情况吗?鼓励参考 C++11 标准。

0 投票
2 回答
4353 浏览

c++ - 使用声明和转发声明之间的冲突

让我们和斗牛犬一起去散步吧:)

假设我有一个命名空间Street::House(在命名空间内Street),其中声明Bulldog了类(让它在):House/Bulldog.hpp

然后,我有Bulldog.hpp

注意发生了什么:我声明注入Street::House::Bulldog 到命名空间中,Street就像声明一样。Street::Bulldogusing

然后,我有Owner.hppBulldog前向声明

最后,我有Owner.cpp

编译错误发生在Owner.cpp

error: 'Bulldog' is already declared in this scope

这种现象的自然解释似乎是 C++ 将这两个Bulldog类视为不同的,但为什么呢?在这种情况下,我看不出有任何歧义,即如果编译器正确实施,它实际上可以工作。

你能建议什么解决方法?我能想到的一种方法是简单地删除from和 move from to的前向声明。但是,这将导致精确包含而不是前向声明BulldogOwner.hpp#include "Bulldog.hpp"Owner.cppOwner.hpp

0 投票
2 回答
933 浏览

c++ - 隐式删除孩子时继承父赋值运算符

在 GCC 4.6 中,即使子的赋值运算符由于移动构造函数而被隐式删除,也可以继承父的赋值运算符。在更高版本的 GCC(以及 Clang)中,这不再可能。让子类使用父类的赋值运算符的正确方法是什么?

0 投票
3 回答
10775 浏览

c++ - 在 C++ 中使用指令与使用声明交换

请参考以下代码:

如上所述,代码无法在 Visual Studio 2008/2010 上编译。错误是:

但是,如果我注释掉 (1) 并取消注释 (2),它将编译 OK。using namespace stdusing std::swap解释这种行为的区别是什么?

0 投票
2 回答
239 浏览

c++ - 为什么 using 不能用于定义虚函数?

我最近发现使用using将基类函数导入派生类的命名空间(当它被隐藏时)。我试图用它从基类中导入一个函数作为派生类中函数的实现:

这不会像.A::foo()中的纯虚函数那样编译C。我希望这using B::foo;将实现foo(). 为什么不是这样?