// Testcase for implicit 'typename' and resolution of 'typename's in the // current scope. class base1 { public: int bar() const { return 1; } }; class base2 { public: int bar() const { return 0; } }; template struct base_trait { typedef base1 base; }; struct base_trait { typedef base2 base; }; template class weird : public base_trait::base { public: typedef base_trait::base base; base f (); int base::* g (); int zowee() const { return bar(); } }; template weird::base weird::f () { return base(); } template int weird::base::* weird::g () { return 0; } int main() { weird z; return z.zowee() || z.f().bar(); }