template < typename T>
struct event_data;
template < typename T>
struct tovoid {
typedef void type;
} ;
template < typename T, typename enable = void >
struct get_data{
typedef event_data< T> type;
} ;
template < typename T>
struct get_data< T, typename tovoid< typename T:: data_t > :: type > {
typedef typename T:: data_t type;
} ;
template < typename T>
struct base{
typedef typename get_data< T> :: type data_type;
base( ) {
data_type( ) ;
}
} ;
struct non_default_impl: public base< non_default_impl> {
struct data{ } ;
typedef data data_t;
} ;
struct default_impl{
} ;
int main( ) {
non_default_impl e1;
// base<default_impl> e2;
return 0 ;
}
dGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBldmVudF9kYXRhOwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IHRvdm9pZCB7Cgl0eXBlZGVmIHZvaWQgdHlwZTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBlbmFibGUgPSB2b2lkPgpzdHJ1Y3QgZ2V0X2RhdGF7CiAgdHlwZWRlZiBldmVudF9kYXRhPFQ+IHR5cGU7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGdldF9kYXRhPFQsIHR5cGVuYW1lIHRvdm9pZDx0eXBlbmFtZSBUOjpkYXRhX3Q+Ojp0eXBlID57CiAgdHlwZWRlZiB0eXBlbmFtZSBUOjpkYXRhX3QgdHlwZTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgYmFzZXsKCXR5cGVkZWYgdHlwZW5hbWUgZ2V0X2RhdGE8VD46OnR5cGUgZGF0YV90eXBlOwoJCgliYXNlKCl7CgkJZGF0YV90eXBlKCk7Cgl9Cn07CgpzdHJ1Y3Qgbm9uX2RlZmF1bHRfaW1wbDogcHVibGljIGJhc2U8bm9uX2RlZmF1bHRfaW1wbD57CglzdHJ1Y3QgZGF0YXt9OwoJCgl0eXBlZGVmIGRhdGEgZGF0YV90Owp9OwpzdHJ1Y3QgZGVmYXVsdF9pbXBsewogICAgCn07CgppbnQgbWFpbigpewoJbm9uX2RlZmF1bHRfaW1wbCBlMTsKLy8JYmFzZTxkZWZhdWx0X2ltcGw+IGUyOwoJcmV0dXJuIDA7Cn0=
compilation info
prog.cpp: In instantiation of 'base<T>::base() [with T = non_default_impl]':
prog.cpp:28:8: required from here
prog.cpp:24:3: error: invalid use of incomplete type 'base<non_default_impl>::data_type {aka struct event_data<non_default_impl>}'
data_type();
^
prog.cpp:2:8: note: declaration of 'base<non_default_impl>::data_type {aka struct event_data<non_default_impl>}'
struct event_data;
^
stdout