, dass wir die folgenden Basisklassen und abgeleiteten Klassen haben:Warum binden Temporäre von Elementfunktionen nicht an den richtigen Typ? Angenommen
#include <string>
#include <iostream>
class Car {
public:
void Drive() { std::cout << "Baby, can I drive your car?" << std::endl; }
};
class Porsche : public Car {
};
..und auch die folgenden Template-Funktion:
template <typename T, typename V>
void Function(void (T::*m1)(void), void (V::*m2)(void)) {
std::cout << (m1 == m2) << std::endl;
}
Warum ist das Kompilieren mit GCC:
int main(int argc, char** argv) {
void (Porsche::*ptr)(void) = &Porsche::Drive;
Function(ptr, ptr);
return 0;
}
... aber nicht das?
int main(int argc, char** argv) {
void (Porsche::*ptr)(void) = &Porsche::Drive;
Function(&Porsche::Drive, ptr);
return 0;
}
Getestet mit g ++ 4.0.1 unter MacOSX und beide kompiliert, beide mit nicht-virtuellen und mit virtuellen Zeigern, wenn beide Zeiger auf die gleiche Methode in der gleichen Klasse verweisen. –
Wirklich? Ich habe auch den exakt gleichen Code unter OSX kompiliert. Es gab folgenden Fehler: Test2.cpp: In Funktion 'void Funktion (void (T :: *)(), void (V :: *)()) [mit T = Auto, V = Porsche]': Test2.cpp: 25: von hier aus instanziiert Test2.cpp: 17: Fehler: ungültige Operanden der Typen 'void (Car :: *)()' und 'void (Porsche :: *)()' zu binär 'operator = = ' –