// The bug is inconsistent, there seems to be no // strict logic. namespace MyNames { template <typename S, typename T> struct MyPair { }; } template <typename T> class MyClass { public: class A { }; MyNames::MyPair<A, int> f(); MyNames::MyPair<A, A> g(); MyNames::MyPair<A, int> h(); }; template <typename T> MyNames::MyPair<typename MyClass<T>::A, int> MyClass<T>::f() { return MyNames::MyPair<A, int>(); } template <typename T> MyNames::MyPair<typename MyClass<T>::A, typename MyClass<T>::A> MyClass<T>::g() { return MyNames::MyPair<A, A>(); } template <typename T> MyNames::MyPair<typename MyClass<T>::A, int> MyClass<T>::h() { return MyNames::MyPair<A, int>(); } int main() { return 0; }