假設我們有以下的基類和派生類:爲什麼不將成員函數臨時綁定到正確的類型?
#include <string>
#include <iostream>
class Car {
public:
void Drive() { std::cout << "Baby, can I drive your car?" << std::endl; }
};
class Porsche : public Car {
};
..和還下面的模板功能:
template <typename T, typename V>
void Function(void (T::*m1)(void), void (V::*m2)(void)) {
std::cout << (m1 == m2) << std::endl;
}
爲什麼這個編譯使用GCC:
int main(int argc, char** argv) {
void (Porsche::*ptr)(void) = &Porsche::Drive;
Function(ptr, ptr);
return 0;
}
...但不是這個?
int main(int argc, char** argv) {
void (Porsche::*ptr)(void) = &Porsche::Drive;
Function(&Porsche::Drive, ptr);
return 0;
}
用g ++測試過4.0.1在MacOSX下編譯都很好,當兩個指針指向同一個類中的同一個方法時,它們都帶有非虛擬指針和虛擬指針。 – 2009-09-17 18:16:49
真的嗎?我還在OSX下編譯了完全相同的代碼。它給出了以下錯誤: Test2.cpp:函數'void Function(void(T :: *)(),void(V :: *)())[with T = Car,V = Porsche]': Test2.cpp:25:從這裏實例化 Test2.cpp:17:錯誤:類型爲'void(Car :: *)()'和'void(Porsche :: *)()'的二元運算符= =' – 2009-09-17 19:10:13