任何人都可以帮助我理解Stanley Lipmann在第3章(图书馆类型)中发现的这种说法吗?
“使用不带有使用声明的命名空间名称的非限定版本是错误的,尽管某些编译器可能无法检测到此错误”
我很难理解他的句子(英语)的语义。
他是否想说出类似以下情况的内容?
int main() {
xx::yy
}
其中xx是未使用“using”语句定义的命名空间,yy是成员?
答案 0 :(得分:4)
示例:
cout
是std
命名空间的名称。 不合格的名称为cout
。 限定名称为std::cout
。在事先没有cout
声明的情况下使用非限定名称(using
)是错误的。您可以使用以下两个声明之一:
// This brings in the entire std namespace
using namespace std;
OR
// This only brings in cout. You would still need to qualify other names,
// such as cin, endl, etc...
using std::cout;
答案 1 :(得分:0)
他所说的是以下代码不应该编译:
#include <iostream>
void foo() {
cout << "This is an error!" << endl;
}
目前尚未定义cout
和endl
名称。它们被声明为std::cout
和std::endl
,为了使用它们,您可以执行以下操作之一:
#include <iostream>
void foo() {
std::cout << "This, I think, is the best way to do it." << std::endl;
}
使用完全限定名称可以防止以后发生冲突:您永远不会有其他名为std::cout
的内容。
#include <iostream>
void foo() {
using std::cout;
using std::endl;
cout << "This is pretty good." << endl;
}
让using
语句指定您正在使用的确切名称,并在函数中使用using
语句,可以节省一些输入并使碰撞变得不太可能。
#include <iostream>
using namespace std;
void foo() {
cout << "This works, but isn't good." << endl;
}
导入整个std
命名空间很可能会让你最终拥有一个与std
函数相同的函数。你可能会在编写它时发现它,或者您可以编写函数,然后将函数的std
版本包含在头文件中,此时您的应用程序将会神秘地破坏。
答案 2 :(得分:0)
命名空间名称是命名空间的名称。
namespace A {
}
namespace B = A;
声明说使用没有using声明的命名空间名称是错误的。但事实并非如此:上面的代码很好,仍然使用名称空间名称A
作为非限定名称。
可能应该说以下内容,以传达其含义
“使用非限定版本的命名空间成员名称,而不使用using声明 在命名空间范围之外是一个错误,尽管有些编译器可能会失败 检测到这个错误“
提及范围很重要。例如,即使它使用命名空间成员名称的非限定版本
,也可以使用以下内容namespace A {
int x;
int &y = x; // x is an unqualified name
}
书籍应该小心尝试而不要使用滑溜的语言。即使在命名空间的范围之外,上述句子也不完全正确,因为您还可以通过使用指令扩展x
的范围。使用声明不是使用非限定名称在命名空间外命名命名空间成员的唯一方法。