T (C::*)にvoid (Foo::*)()はマッチすべきか

// includeは省略

template<typename T>
struct remove_mem_ptr;

template<typename T, class C>
struct remove_mem_ptr<T (C::*)> {
	typedef T type;
};

template<typename T, class C>
struct add_mem_ptr {
	typedef T (C::*type);
};

struct Foo {};

boost::enable_if<
    boost::is_same<
        remove_mem_ptr<
            add_mem_ptr<void(), Foo>::type>::type,
        void()> >::type
func();

以上のようなコードをVC8とgcc4.2でコンパイルしてみたところ、それぞれで挙動が違った。VCでは

error C2039: 'type' : 'boost::enable_if<Cond>' のメンバではありません。
        with
        [
            Cond=boost::is_same<void (void),void (void)>
        ]
というようなエラーを吐き、一方のgccではコンパイルに通った。さて、これはどちらの挙動が正しいのだろうか?remove_mem_ptrはTをvoid()という関数としてマッチしてもよいのか?それにしても上のエラー、is_sameの二つの引数はどうみても同じにしか見えないのだが。