“using namespace”子句在哪些范围内有效?[复制]

In what scopes is the "using namespace" clause valid? [duplicate]

提问人:StoneThrow 提问时间:12/13/2019 更新时间:12/13/2019 访问量:133

问:

我曾经听说/读到过(参考资料已经溜走了;无法引用它)“”子句在任何范围内都有效,但它似乎在类范围内无效: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”指令在哪些范围内有效

使用 using 指令的 C++ compiler-errors 命名空间

评论


答:

4赞 Fred Larson 12/13/2019 #1

cppreference.com

Using指令只允许在命名空间作用域和块作用域中使用。

因此,您可以在命名空间(包括全局命名空间)或代码块中使用它们。类声明两者都不是。