提问人:StoneThrow 提问时间:12/13/2019 更新时间:12/13/2019 访问量:133
“using namespace”子句在哪些范围内有效?[复制]
In what scopes is the "using namespace" clause valid? [duplicate]
问:
我曾经听说/读到过(参考资料已经溜走了;无法引用它)“”子句在任何范围内都有效,但它似乎在类范围内无效:using namespace
// main.cpp
#include <iostream>
namespace foo
{
void func() { std::cout << __FUNCTION__ << std::endl; }
};
class Foo
{
using namespace foo;
public:
Foo() { func(); }
};
int main( int argc, char* argv[] )
{
Foo f;
}
.
$ g++ --version
g++ (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2)
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
.
$ g++ -g ./main.cpp
./main.cpp:12:7: error: expected nested-name-specifier before 'namespace'
using namespace foo;
^~~~~~~~~
./main.cpp: In constructor 'Foo::Foo()':
./main.cpp:15:13: error: 'func' was not declared in this scope
Foo() { func(); }
^~~~
./main.cpp:15:13: note: suggested alternative:
./main.cpp:7:8: note: 'foo::func'
void func() { std::cout << __FUNCTION__ << std::endl; }
^~~~
$
$ g++ --std=c++11 -g ./main.cpp
./main.cpp:12:7: error: expected nested-name-specifier before 'namespace'
using namespace foo;
^~~~~~~~~
./main.cpp: In constructor 'Foo::Foo()':
./main.cpp:15:13: error: 'func' was not declared in this scope
Foo() { func(); }
^~~~
./main.cpp:15:13: note: suggested alternative:
./main.cpp:7:8: note: 'foo::func'
void func() { std::cout << __FUNCTION__ << std::endl; }
^~~~
以下变体会导致相同的编译器错误:class Foo
class Foo
{
using namespace ::foo;
public:
Foo()
{
func();
}
};
以下变体不会导致编译器错误或警告:class Foo
class Foo
{
public:
Foo()
{
using namespace foo;
func();
}
};
.
class Foo
{
public:
Foo()
{
foo::func();
}
};
基于阅读诸如 this 和 this 之类的帖子,我对编译器错误的(不正确的?)理解是,该错误本质上需要对使用的命名空间进行完全限定,即我在上面的第一个变体中尝试的内容。class Foo
请注意:除了显式使用编译器标志外,根据著名的堆栈溢出问答,使用的编译器版本远高于不遇到此错误所需的最小值(没有显式使用编译器标志)。--std=c++11
--std=c++11
在这种情况下,这个编译器错误意味着什么(如果与我上面提到的理解不同)? (我的用法似乎与两个提到的 Stack Overflow Q&A 中的用法不同)。
一般而言,“using namespace”指令在哪些范围内有效?
答:
4赞
Fred Larson
12/13/2019
#1
Using指令只允许在命名空间作用域和块作用域中使用。
因此,您可以在命名空间(包括全局命名空间)或代码块中使用它们。类声明两者都不是。
评论