¿Se pueden definir los miembros de la clase fuera del espacio de nombres en el que se declaran?
A veces encuentro código como el siguiente (en realidad, algunos asistentes de clase crean dicho código):
// C.h
namespace NS {
class C {
void f();
};
}
y en el archivo de implementación:
// C.cpp
#include "C.h"
using namespace NS;
void C::f() {
//...
}
Todos los compiladores que probé aceptan ese tipo de código (gcc, clang, msvc, compileonline.com). Lo que me hace sentir incómodo es elusing namespace NS;
. Desde mi punto de vistaC::f()
vive en el espacio de nombres global en un entorno que tiene acceso no calificado a objetos que viven en el espacio de nombres NS. Pero en opinión del compiladorvoid C::f()
vive ennamespace NS
. Como todos los compiladores que probé comparten ese punto de vista, probablemente tengan razón, pero ¿en qué parte del estándar está respaldada esta opinión?