#include <iostream>
using namespace std;
class OverVoid{
public :
virtual ~OverVoid( ) {
} ;
} ;
class Meta : public OverVoid{
} ;
template < typename T>
struct is_overvoid_or_meta
{
static const bool value = false ;
} ;
template <> struct is_overvoid_or_meta< OverVoid>
{
static const bool value = true ;
} ;
template <> struct is_overvoid_or_meta< Meta>
{
static const bool value = true ;
} ;
template < typename _Ty>
class Move
{
typedef typename std:: enable_if < is_overvoid_or_meta< _Ty> :: value , _Ty> :: type Type;
} ;
int main( )
{
Move< OverVoid> m1;
Move< Meta> m2;
Move< int > m3;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIE92ZXJWb2lkewpwdWJsaWM6CgogICAgdmlydHVhbCB+T3ZlclZvaWQoKXsKICAgIH07Cn07CgpjbGFzcyBNZXRhIDogcHVibGljIE92ZXJWb2lkewoKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgaXNfb3ZlcnZvaWRfb3JfbWV0YQp7CiAgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKfTsKCnRlbXBsYXRlIDw+IHN0cnVjdCBpc19vdmVydm9pZF9vcl9tZXRhPE92ZXJWb2lkPgp7CiAgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOwp9OwoKdGVtcGxhdGUgPD4gc3RydWN0IGlzX292ZXJ2b2lkX29yX21ldGE8TWV0YT4KewogICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIF9UeT4KY2xhc3MgTW92ZQp7CiAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc19vdmVydm9pZF9vcl9tZXRhPF9UeT46OnZhbHVlLCBfVHk+Ojp0eXBlIFR5cGU7Cn07CgppbnQgbWFpbigpCnsKCU1vdmU8T3ZlclZvaWQ+IG0xOwoJTW92ZTxNZXRhPiBtMjsKCU1vdmU8aW50PiBtMzsKCXJldHVybiAwOwp9
compilation info
prog.cpp: In instantiation of 'class Move<int>':
prog.cpp:42:12: required from here
prog.cpp:35:82: error: no type named 'type' in 'struct std::enable_if<false, int>'
typedef typename std::enable_if<is_overvoid_or_meta<_Ty>::value, _Ty>::type Type;
^
stdout