В g ++ 4.0.1 примеры, которые вы предоставляете, прекрасно компилируются, но возникают проблемы, связанные со сравнением указателей на функции-члены разных типов (даже если сравниваемый элемент является виртуальным методом.
struct base
{
void f() {}
virtual void g() {}
};
struct derived : public base
{
void f() {}
virtual void g() {}
};
template <typename T, typename U>
bool cmp( void (T::*lhs)(), void (U::*rhs)() ) {
return lhs == rhs;
}
int main()
{
void (base::*bp)() = &base::f;
void (base::*bvp)() = &base::g;
cmp( bp, &base::f ); // compiles
cmp( bvp, &base::g ); // compiles
void (derived::*dp)() = &derived::f;
void (derived::*dvp)() = &derived::g;
cmp( dp, &derived::f ); // compiles
cmp( dvp, &derived::g ); // compiles
cmp( bp, dp ); // fails to compile
cmp( bvp, dvp ); // fails to compile
}
Теперь я протестировал то же самое с онлайн-компилятором comeau, и весь код компилируется нормально. Я не могу сразу сказать вам, что такое стандартное поведение. Мне придется некоторое время просматривать стандарт.
РЕДАКТИРОВАТЬ: я думаю, нет, Литб уже сделал.