What happens if you drop the ::type from is_same?
void read_data_24( typename enable_if< mpl::and_< mpl::true_, mpl::bool_< is_same< T1, T2 >::value > > >::type* /* ptr */ = 0)
(I don't have VS compiler so can't test - but dropping ::type from is_same still compiles fine on gcc 4.7.0 for me)