// A type templated for different function call signatures.
template < typename Signature> class Used;
template < typename T_Ret, typename ...T_Args >
class Used< T_Ret( T_Args...) > {
public :
// A static method for a specific type.
template < typename T>
static void specific( ) { }
} ;
// Some class using the above.
template < typename T>
class User {
public :
// A method that must call the specific function of used.
template < typename T_Ret, typename ...T_Args >
void method( ) {
using It = Used< T_Ret( T_Args...) > ;
using Me = T;
// error: expected primary-expression before '>' token
It:: specific < Me> ( ) ;
}
} ;
int main( ) {
User< int > user;
user.method < void , int > ( ) ;
}
Ly8gQSB0eXBlIHRlbXBsYXRlZCBmb3IgZGlmZmVyZW50IGZ1bmN0aW9uIGNhbGwgc2lnbmF0dXJlcy4KdGVtcGxhdGUgPHR5cGVuYW1lIFNpZ25hdHVyZT4gY2xhc3MgVXNlZDsKdGVtcGxhdGUgPHR5cGVuYW1lIFRfUmV0LCB0eXBlbmFtZSAuLi5UX0FyZ3M+CmNsYXNzIFVzZWQ8VF9SZXQoVF9BcmdzLi4uKT4gewpwdWJsaWM6CgkvLyBBIHN0YXRpYyBtZXRob2QgZm9yIGEgc3BlY2lmaWMgdHlwZS4KCXRlbXBsYXRlIDx0eXBlbmFtZSBUPgoJc3RhdGljIHZvaWQgc3BlY2lmaWMoKSB7IH0KfTsKCi8vIFNvbWUgY2xhc3MgdXNpbmcgdGhlIGFib3ZlLgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgVXNlciB7CnB1YmxpYzoKCS8vIEEgbWV0aG9kIHRoYXQgbXVzdCBjYWxsIHRoZSBzcGVjaWZpYyBmdW5jdGlvbiBvZiB1c2VkLgoJdGVtcGxhdGUgPHR5cGVuYW1lIFRfUmV0LCB0eXBlbmFtZSAuLi5UX0FyZ3M+Cgl2b2lkIG1ldGhvZCgpIHsKCQl1c2luZyBJdCA9IFVzZWQ8VF9SZXQoVF9BcmdzLi4uKT47CgkJdXNpbmcgTWUgPSBUOwoJCS8vIGVycm9yOiBleHBlY3RlZCBwcmltYXJ5LWV4cHJlc3Npb24gYmVmb3JlICc+JyB0b2tlbgoJCUl0OjpzcGVjaWZpYzxNZT4oKTsKCX0KfTsKCmludCBtYWluKCkgewoJVXNlcjxpbnQ+IHVzZXI7Cgl1c2VyLm1ldGhvZDx2b2lkLCBpbnQ+KCk7Cn0K