class A {
public:
  static int n;
};
int main() {
  int A;
  A::n = 42;        // OK
  A b;              // ill-formed: A does not name a type
} — end example
class X { };
class C {
  class X { };
  static const int number = 50;
  static X arr[number];
};
X C::arr[number];   // ill-formed:
                    // equivalent to ::X C::arr[C::number];
                    // and not to C::X C::arr[C::number];
 — end examplenested-name-specifier class-name :: ~ class-name
struct C {
  typedef int I;
};
typedef int I1, I2;
extern int* p;
extern int* q;
p->C::I::~I();      // I is looked up in the scope of C
q->I1::~I2();       // I2 is looked up in the scope of the postfix-expression
struct A {
  ~A();
};
typedef A AB;
int main() {
  AB* p;
  p->AB::~AB();     // explicitly calls the destructor for A
} — end example
struct A { A(); };
struct B: public A { B(); };
A::A() { }
B::B() { }
B::A ba;            // object of type A
A::A a;             // error, A::A is not a type name
struct A::A a2;     // object of type A
 — end example
int x;
namespace Y {
  void f(float);
  void h(int);
}
namespace Z {
  void h(double);
}
namespace A {
  using namespace Y;
  void f(int);
  void g(int);
  int i;
}
namespace B {
  using namespace Z;
  void f(char);
  int i;
}
namespace AB {
  using namespace A;
  using namespace B;
  void g();
}
void h()
{
  AB::g();          // g is declared directly in AB, therefore S is { AB::g() } and AB::g() is chosen
  AB::f(1);         // f is not declared directly in AB so the rules are applied recursively to A and B;
                    // namespace Y is not searched and Y::f(float) is not considered;
                    // S is  and overload resolution chooses A::f(int)
  AB::f('c');       // as above but resolution chooses B::f(char)
  AB::x++;          // x is not declared directly in AB, and is not declared in A or B, so the rules
                    // are applied recursively to Y and Z, S is { } so the program is ill-formed
  AB::i++;          // i is not declared directly in AB so the rules are applied recursively to A and B,
                    // S is  so the use is ambiguous and the program is ill-formed
  AB::h(16.8);      // h is not declared directly in AB and not declared directly in A or B so the rules
                    // are applied recursively to Y and Z, S is  and
                    // overload resolution chooses Z::h(double)
} — end example
namespace A {
  int a;
}
namespace B {
  using namespace A;
}
namespace C {
  using namespace A;
}
namespace BC {
  using namespace B;
  using namespace C;
}
void f()
{
  BC::a++;          // OK: S is 
}
namespace D {
  using A::a;
}
namespace BD {
  using namespace B;
  using namespace D;
}
void g()
{
  BD::a++;          // OK: S is 
} — end example
namespace B {
  int b;
}
namespace A {
  using namespace B;
  int a;
}
namespace B {
  using namespace A;
}
void f()
{
  A::a++;           // OK: a declared directly in A, S is { A::a }
  B::a++;           // OK: both A and B searched (once), S is { A::a }
  A::b++;           // OK: both A and B searched (once), S is { B::b }
  B::b++;           // OK: b declared directly in B, S is { B::b }
} — end example
namespace A {
  struct x { };
  int x;
  int y;
}
namespace B {
  struct y { };
}
namespace C {
  using namespace A;
  using namespace B;
  int i = C::x;     // OK, A::x (of type int)
  int j = C::y;     // ambiguous, A::y or B::y
} — end examplenested-name-specifier unqualified-id
namespace A {
  namespace B {
    void f1(int);
  }
  using namespace B;
}
void A::f1(int){ }  // ill-formed, f1 is not a member of A
 — end example
namespace A {
  namespace B {
    void f1(int);
  }
}
namespace C {
  namespace D {
    void f1(int);
  }
}
using namespace A;
using namespace C::D;
void B::f1(int){ }  // OK, defines A::B::f1(int)
 — end example