Comportamento interessante do compilador com espaços para nome

Suponha o seguinte código:

#include <iostream>
using namespace std;

namespace X
{
  class A{};

  void f(A a){}

  void g(int a){}
}

int main()
{
  X::A a;
  f(a);
  g(5);
}

Ao compilar o código, ocorre o seguinte erro de compilação:

main.cpp: Na função 'int main ()':
main.cpp: erro: 'g' não foi declarado neste escopo

Então a funçãof é compilado perfeitamente, masg não é. Quão? Ambos pertencem ao mesmo espaço para nome. O compilador deduz essa funçãof pertence aosX espaço para nome do argumento do tipoX::A? Como o compilador se comporta nesses casos?

questionAnswers(3)

yourAnswerToTheQuestion