18

次のスニペットについて考えてみます。

void Foo() // 1
{
}

namespace
{
  void Foo() // 2
  {
  }
}

int main()
{
  Foo(); // Ambiguous.
  ::Foo(); // Calls the Foo in the global namespace (Foo #1).

  // I'm trying to call the `Foo` that's defined in the anonymous namespace (Foo #2).
}

この場合、匿名の名前空間内で何かを参照するにはどうすればよいですか?

4

5 に答える 5

19

できません。この規格には、次のセクション(§7.3.1.1、C ++ 03)が含まれています。

unnamed-namespace-definitionは、に置き換えられたかのように動作します

  namespace unique { /* empty body */ }
  using namespace unique;
  namespace unique { namespace-body }

ここで、翻訳単位での一意の出現はすべて同じ識別子に置き換えられ、この識別子はプログラム全体の他のすべての識別子とは異なります。

したがって、その一意の名前を参照する方法はありません。

ただし、技術的には次のようなものを代わりに使用できます。

int i;

namespace helper {
    namespace {
        int i;
        int j;
    }
}

using namespace helper;

void f() { 
    j++; // works
    i++; // still ambigous
    ::i++; // access to global namespace
    helper::i++; // access to unnamed namespace        
}
于 2010-09-09T02:27:13.777 に答える
5

Georgは標準に準拠し、正しく、正しく、立派な答えを提供しますが、私はハッキーなものを提供したいと思います-匿名の名前空間内で別の名前空間を使用してください:

#include <iostream>

using namespace std;

namespace
{
namespace inner
{
    int cout = 42;
}
}

int main()
{
    cout << inner::cout << endl;
    return 0;
}
于 2010-09-09T02:36:37.477 に答える
2

既存の名前空間の配置を変更しないと私が考えることができる唯一の解決策はmain、匿名の名前空間の関数に委任することです。(mainそれ自体はグローバル関数(§3.6.1/ 1)である必要があるため、匿名の名前空間に含めることはできません。)

void Foo() // 1
{
}

namespace
{
  void Foo() // 2
  {
  }
}

namespace { // re-open same anonymous namespace

    int do_main()
    {
      Foo(); // Calls local, anonymous namespace (Foo #2).
      ::Foo(); // Calls the Foo in the global namespace (Foo #1).

      return 0; // return not optional
    }

}

int main() {
    return do_main();
}
于 2010-09-09T02:37:57.297 に答える
0

唯一の実際の方法は、その名前空間にアクセスするコードを名前空間自体の中に配置することです。名前空間には識別子がないため、名前空間に名前空間を解決する方法はありません。これを指定すると、あいまいな解決の問題を解決できます。

コードがnamespace{}ブロック自体の内部にある場合、ローカル名はグローバル名よりも優先されるため、Foo()は名前空間内のFoo()を呼び出し、:: Foo()はグローバルで名前空間を呼び出します範囲。

于 2010-09-09T02:32:15.177 に答える
0

ローカル名前空間関数の名前を変更するだけです。

于 2013-11-27T15:57:13.373 に答える