Supongamos que tenemos la siguiente base y clases derivadas:¿Por qué las funciones temporales de miembro no se vinculan con el tipo correcto?
#include <string>
#include <iostream>
class Car {
public:
void Drive() { std::cout << "Baby, can I drive your car?" << std::endl; }
};
class Porsche : public Car {
};
..y también la función siguiente plantilla:
template <typename T, typename V>
void Function(void (T::*m1)(void), void (V::*m2)(void)) {
std::cout << (m1 == m2) << std::endl;
}
¿Por qué esta compilación usando GCC:
int main(int argc, char** argv) {
void (Porsche::*ptr)(void) = &Porsche::Drive;
Function(ptr, ptr);
return 0;
}
... pero no esto?
int main(int argc, char** argv) {
void (Porsche::*ptr)(void) = &Porsche::Drive;
Function(&Porsche::Drive, ptr);
return 0;
}
Probado con g ++ 4.0.1 bajo MacOSX y ambos compilados bien, ambos con punteros virtuales y no virtuales cuando ambos punteros se refieren al mismo método en la misma clase. –
¿De verdad? También compilé exactamente el mismo código en OSX. Se dio el siguiente error: test2.cpp: En función de 'Función (void (T :: *)(), nula (V :: *)()) [con T = coches, V = Porsche]': Test2.cpp: 25: instanciado desde aquí Test2.cpp: 17: error: operandos inválidos de los tipos 'void (Car :: *)()' y 'void (Porsche :: *)()' a binary 'operator = = ' –