struct Foo{ } ;
struct Bar{ } ;
/////////////////////////////////////////////////////////////////////////////
template < typename P>
struct Attributes
{
} ;
template <>
struct Attributes< Foo>
{
} ;
/////////////////////////////////////////////////////////////////////////////
template < typename P>
struct Frobnigator
{
Attributes< P> attributes;
} ;
/////////////////////////////////////////////////////////////////////////////
template < typename P>
struct OuterHandler
{
typedef Frobnigator< P> Frob;
template < typename T>
struct InnerHandler;
void doStuff( ) ;
} ;
template <>
struct OuterHandler< Foo>
{
typedef Frobnigator< Foo> Frob;
template < typename T>
struct InnerHandler;
void doStuff( ) ;
} ;
/////////////////////////////////////////////////////////////////////////////
template < typename P>
template < typename T>
struct OuterHandler< P> :: InnerHandler
{
typename T:: Attributes attributes;
InnerHandler( ) { }
} ;
template < typename T>
struct OuterHandler< Foo> :: InnerHandler
{
typename T:: Attributes attributes;
InnerHandler( ) { }
} ;
/////////////////////////////////////////////////////////////////////////////
template < typename P>
void OuterHandler< P> :: doStuff ( )
{
InnerHandler< Frob> ( ) ;
}
void OuterHandler< Foo> :: doStuff ( )
{
InnerHandler< Frob> ( ) ;
}
/////////////////////////////////////////////////////////////////////////////
int main( )
{
return 0 ;
}
/////////////////////////////////////////////////////////////////////////////
c3RydWN0IEZvb3t9OwpzdHJ1Y3QgQmFye307CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKdGVtcGxhdGU8dHlwZW5hbWUgUD4Kc3RydWN0IEF0dHJpYnV0ZXMKewp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgQXR0cmlidXRlczxGb28+CnsKfTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgp0ZW1wbGF0ZTx0eXBlbmFtZSBQPgpzdHJ1Y3QgRnJvYm5pZ2F0b3IKewoJQXR0cmlidXRlczxQPglhdHRyaWJ1dGVzOwp9OwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCnRlbXBsYXRlPHR5cGVuYW1lIFA+CnN0cnVjdCBPdXRlckhhbmRsZXIKewoJdHlwZWRlZiBGcm9ibmlnYXRvcjxQPglGcm9iOwoJCgl0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoJc3RydWN0IElubmVySGFuZGxlcjsKCQoJdm9pZCBkb1N0dWZmKCk7Cn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBPdXRlckhhbmRsZXI8Rm9vPgp7Cgl0eXBlZGVmIEZyb2JuaWdhdG9yPEZvbz4JRnJvYjsKCQoJdGVtcGxhdGU8dHlwZW5hbWUgVD4KCXN0cnVjdCBJbm5lckhhbmRsZXI7CgkKCXZvaWQgZG9TdHVmZigpOwp9OwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCnRlbXBsYXRlPHR5cGVuYW1lIFA+CnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBPdXRlckhhbmRsZXI8UD46OklubmVySGFuZGxlcgp7CQoJdHlwZW5hbWUgVDo6QXR0cmlidXRlcyBhdHRyaWJ1dGVzOwoJSW5uZXJIYW5kbGVyKCl7fQp9OwoKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBPdXRlckhhbmRsZXI8Rm9vPjo6SW5uZXJIYW5kbGVyCnsKCXR5cGVuYW1lIFQ6OkF0dHJpYnV0ZXMgYXR0cmlidXRlczsKCUlubmVySGFuZGxlcigpe30KfTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgp0ZW1wbGF0ZTx0eXBlbmFtZSBQPgp2b2lkIE91dGVySGFuZGxlcjxQPjo6ZG9TdHVmZigpCnsKCUlubmVySGFuZGxlcjxGcm9iPigpOwp9Cgp2b2lkIE91dGVySGFuZGxlcjxGb28+Ojpkb1N0dWZmKCkKewoJSW5uZXJIYW5kbGVyPEZyb2I+KCk7Cn0KCQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKaW50IG1haW4oKQp7CglyZXR1cm4gMDsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8K