考虑以下的 C++ 代码。
namespace A {
void f() { // first function
}
void f(int) { // second function
}
}
...
using A::f; // introduces both functions
有没有一种方法只引入一个函数?考虑以下的 C++ 代码。
namespace A {
void f() { // first function
}
void f(int) { // second function
}
}
...
using A::f; // introduces both functions
有没有一种方法只引入一个函数?该行为在标准中已经定义。
C++03 7.3.3 using声明
:
"…如果名称是一个重载成员函数的名称,则所有被命名为该名称的函数都必须可访问。"
using
关键字可以将所有名称引入当前作用域。因此,使用当前代码是不可能的。
但是,您可以按以下方式部分地将名称引入文件:
namespace A {
void f(); // declaration
}
using A::f;
// now only `A::f()` is visible in the subsequent code
// technically `A::f(int)` is not yet visible (thus unusable)
// introduce the other function later on
namespace A {
void f(int);
}
演示。
编辑:
更好的方法是将A::f(int)
放在嵌套的namespace
中,并引入别名(以便于使用)。
namespace A {
void f();
namespace Internal {
void f(int);
}
}
using A::f;
namespace A_ = A::Internal;
A_::f(int)
。A::f(int)
,所以当然找不到它。这是一个修复版本:http://www.ideone.com/2weTx - TonyKvoid f(int i) { A::f(i); }
using namespace std;
using std::cout;
using std::cin;
using std::endl;
cout
、cin
和endl
,而无需使用命名空间前缀。如果您在某个时刻遇到命名冲突,查看一组using
指令要容易得多,而不必想知道您已公开的整个命名空间中错误来自哪里。
如果存在一系列命名空间或命名空间名称太长,人们还会使用using
指令来处理单个函数/变量。如果您有类似以下内容的东西:
namespace my_really_long_and_pointless_namespace_that_does_nothing_at_all {
void foo() { ... }
}
或者
namespace1 {
namespace2 {
...
namepaceN {
void foo() { ... }
}
}
}
每次想调用foo()方法时都需要重复编写一遍,这真是让人烦恼。通过编写
using my_really_long_and_pointless_namespace_that_does_nothing_at_all::foo;
分别
using namespace1::namespace2:: ... ::namespaceN::foo;
namespace A {
void f() { // first function
} }
using A::f; // introduces only above function
namespace A {
void f(int) { // second function
}
}
可以将它们包装在另一个作用域中:
namespace B { // Wrap the first function
void f() { A::f(); }
}
namespace C { // Wrap the second function
void f(int i) { A::f(i); }
}
int main(int argc, char *argv[])
{
{
using B::f; // Make the first function available
f();
} // Make the first function unavailable
{
using C::f; // Make the second function available
f(0);
} // Make the second function unavailable
return 0;
}
但我不认为你可以用单个using
声明来做到这一点。
C++没有从命名空间导入一个特定函数重载的机制。
作为一种解决方法,您可以将函数调用包装到本地函数中:
static inline void f(int i) { A::f(i); }
static
关键字非常重要 -
f()
和 A::f()
之间生成的代码没有区别)f
,则不会生成额外的代码
using
总是应用于标识符,而不是具体的实体名称。这就是事实。 - sbi