Namespace Association - Using the GNU Compiler Collection (GCC)
Description: Using the GNU Compiler Collection (GCC)

Next: Type Traits, Previous: C++ Attributes, Up: C++ Extensions

### 7.8 Namespace Association

Caution: The semantics of this extension are not fully defined. Users should refrain from using this extension as its semantics may change subtly over time. It is possible that this extension will be removed in future versions of G++.

A using-directive with `__attribute ((strong))` is stronger than a normal using-directive in two ways:

- Templates from the used namespace can be specialized and explicitly instantiated as though they were members of the using namespace.
- The using namespace is considered an associated namespace of all templates in the used namespace for purposes of argument-dependent name lookup.

The used namespace must be nested within the using namespace so that normal unqualified lookup works properly.

This is useful for composing a namespace transparently from implementation namespaces. For example:

         namespace std {
           namespace debug {
             template <class T> struct A { };
           }
           using namespace debug __attribute ((__strong__));
           template <> struct A<int> { };   // ok to specialize

           template <class T> void f (A<T>);
         }

         int main()
         {
           f (std::A<float>());             // lookup finds std::f
           f (std::A<int>());
         }