C++0x inline namespace

inline namespace と書くことで、その名前空間は透過的になり
異なる名前空間でも特殊化できるようになる

namespace Lib {
    inline namespace Lib_1 {
        template <class T> class A;
    }

    template <class T>
    void g(T);
}


struct MyClass {};
namespace Lib {
    template <> class A<MyClass> {};
}

int main()
{
    Lib::A<MyClass> a; // OK
    g(a);

    return 0;
}

C++98 と C++0x のライブラリを共存させるための拡張らしいが、共存のさせ方がわからない



※追記
C++98とC++0xのライブラリの共存というのは、TR1ライブラリがstd::tr1名前空間になってるのをstd名前空間としても使えるようにする、ということみたいです。

namespace std {
    inline namespace tr1 {
        template <class T> class shared_ptr;
    }
}

std::shared_ptr<int>      p1; // OK
std::tr1::shared_ptr<int> p2; // OK

N2535 Namespace Association ("inline namespace")

C++0x言語拡張まとめ