#include <iostream>
#include <cstdlib>
#include <string>
#include <typeinfo>
//////////////////////////////////////////////////////////////////////////////////////
class Bar
{
public :
enum TYPE{ } ;
} ;
//////////////////////////////////////////////////////////////////////////////////////
template < typename T>
class Foo
{
public :
template < typename P>
void setValue1( ) ;
template < typename P, int >
void setValue2( ) ;
template < typename P, typename P:: TYPE >
void setValue3( ) ;
private :
T m_value;
} ;
//////////////////////////////////////////////////////////////////////////////////////
template < typename T>
template < typename P>
void Foo< T> :: setValue1 ( )
{
}
template < typename T>
template < typename P, int >
void Foo< T> :: setValue2 ( )
{
}
template < typename T>
template < typename P, typename P:: TYPE >
void Foo< T> :: setValue3 ( )
{
}
//////////////////////////////////////////////////////////////////////////////////////
int main( )
{
Foo< Bar:: TYPE > f1;
f1.setValue1 < Bar> ( ) ; // Compiles
f1.setValue2 < Bar, int > ( ) ; // ERROR
f1.setValue3 < Bar, Bar:: TYPE > ( ) ; // ERROR
return EXIT_SUCCESS ;
}
//////////////////////////////////////////////////////////////////////////////////////
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHR5cGVpbmZvPgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmNsYXNzIEJhcgp7CnB1YmxpYzoKCWVudW0gVFlQRXt9Owp9OwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIEZvbwp7CnB1YmxpYzoKCXRlbXBsYXRlPHR5cGVuYW1lIFA+Cgl2b2lkIHNldFZhbHVlMSgpOwoJCgl0ZW1wbGF0ZTx0eXBlbmFtZSBQLCBpbnQ+Cgl2b2lkIHNldFZhbHVlMigpOwoJCgl0ZW1wbGF0ZTx0eXBlbmFtZSBQLCB0eXBlbmFtZSBQOjpUWVBFPgoJdm9pZCBzZXRWYWx1ZTMoKTsKCnByaXZhdGU6CglUCW1fdmFsdWU7Cn07CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KdGVtcGxhdGU8dHlwZW5hbWUgUD4Kdm9pZCBGb288VD46OnNldFZhbHVlMSgpCnsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KdGVtcGxhdGU8dHlwZW5hbWUgUCwgaW50Pgp2b2lkIEZvbzxUPjo6c2V0VmFsdWUyKCkKewp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp0ZW1wbGF0ZTx0eXBlbmFtZSBQLCB0eXBlbmFtZSBQOjpUWVBFPgp2b2lkIEZvbzxUPjo6c2V0VmFsdWUzKCkKewp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKaW50IG1haW4oKQp7CglGb288QmFyOjpUWVBFPiBmMTsKCQoJZjEuc2V0VmFsdWUxPEJhcj4oKTsJCS8vIENvbXBpbGVzCglmMS5zZXRWYWx1ZTI8QmFyLCBpbnQ+KCk7CS8vIEVSUk9SCglmMS5zZXRWYWx1ZTM8QmFyLCBCYXI6OlRZUEU+KCk7CS8vIEVSUk9SCgkKCXJldHVybiBFWElUX1NVQ0NFU1M7Cn0KICAgIAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwo=