Search code examples
c++namespacesambiguityunnamed-namespace

Ambiguity between function inside unnamed namespace, and function outside


Consider the following snippet:

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).
}

How can I refer to something inside an anonymous namespace in this case?


Solution

  • You can't. The standard contains the following section (§7.3.1.1, C++03):

    An unnamed-namespace-definition behaves as if it were replaced by

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

    where all occurrences of unique in a translation unit are replaced by the same identifier and this identifier differs from all other identifiers in the entire program.

    Thus you have no way to refer to that unique name.

    You could however technically use something like the following instead:

    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        
    }