"using" 定义成员函数和非成员函数时的关键字

"using" keyword when defining member functions and non-member functions

在定义成员函数和非成员函数的上下文中,“using”关键字是否有不同的效果?下面的示例代码向我暗示它可能。

main.cpp

  #include "baz.h"
  int main()
  {
      foo::bar x;
      x.baz();
      foo::foo_non_member();
  }

baz.h

  namespace foo
  {
      class bar
      {
      public:
          bar() = default;
          void baz();
      };

      void foo_non_member();
  };

baz.cpp

  #include "baz.h"
  #include<iostream>

  using namespace foo;
  void bar::baz()
  {
      std::cout << "baz\n";
  }

  namespace foo
  {
  void foo_non_member()
  {
      std::cout << "non-member\n";
  }
  }

以上代码编译运行

$> g++ main.cpp baz.cpp; ./a.out
baz
non-member

如果我从 baz.cpp 中删除 using namespace foo;,我会收到编译器错误。

$> g++ main.cpp baz.cpp
baz.cpp:5:6: error: ‘bar’ has not been declared
 void bar::baz()

如果我将 using 语句放回去并将 foo_non_member() 的定义移到 foo 命名空间之外,我会收到链接器错误。

$> g++ main.cpp baz.cpp
/tmp/ccHeSwsZ.o: In function `main':
main.cpp:(.text+0x24): undefined reference to `foo::foo_non_member()'
collect2: error: ld returned 1 exit status

为什么 using 关键字在这里对于 bar::baz()foo_non_member() 似乎没有相同的效果?

对于这部分:

using namespace foo;
void bar::baz()
{
   std::cout << "baz\n";
}

using namespace foo; 用于查找 bar:: 部分,因此编译器能够将 void bar::baz() 的定义与命名空间 foo。 如果你删除 using namespace foo; 它无法找到 bar.

If I put that using statement back in and move the definition of foo_non_member() outside of the foo namespace, I get a linker error.

void foo_non_member()
{
   std::cout << "non-member\n";
}

此处 foo_non_memberbar:: 或任何其他(根据规范)允许编译器确定此定义与命名空间 foo.

标准委员会当然可以在规范中添加一些规则,以允许编译器在 using namespace foo; 存在的情况下将 foo_non_member 定义和声明放在一起,但他们决定不这样做不要这样做。

这样做的原因可能是因为您会不清楚是否要在命名空间 foo 之外定义一个新的 void foo_non_member(),或者是否要为 void foo_non_member()foo