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)