#include <iostream>
#include <typeinfo>
using namespace std;
class Base
{
public:
void doStuff() {}
};
class Derived : private Base
{
public:
// Using older access declaration (without using) shoots a warning
// and results in the same compilation error
using Base::doStuff;
};
template<class C, typename Func>
void exec(C *c, Func func)
{
(c->*func)();
}
int main()
{
Derived d;
// Until here, everything compiles fine
d.doStuff();
// For some reason, I can't access the function pointer
//exec(&d,&Derived::doStuff);
cout << typeid(&Derived::doStuff).name() << endl << typeid(&Base::doStuff).name() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKY2xhc3MgQmFzZQp7CnB1YmxpYzoKICAgIHZvaWQgZG9TdHVmZigpIHt9Cn07CgpjbGFzcyBEZXJpdmVkIDogcHJpdmF0ZSBCYXNlCnsKcHVibGljOgogICAgLy8gVXNpbmcgb2xkZXIgYWNjZXNzIGRlY2xhcmF0aW9uICh3aXRob3V0IHVzaW5nKSBzaG9vdHMgYSB3YXJuaW5nCiAgICAvLyBhbmQgcmVzdWx0cyBpbiB0aGUgc2FtZSBjb21waWxhdGlvbiBlcnJvcgogICAgdXNpbmcgQmFzZTo6ZG9TdHVmZjsKfTsKCnRlbXBsYXRlPGNsYXNzIEMsIHR5cGVuYW1lIEZ1bmM+CnZvaWQgZXhlYyhDICpjLCBGdW5jIGZ1bmMpCnsKICAgIChjLT4qZnVuYykoKTsKfQoKaW50IG1haW4oKQp7CiAgICBEZXJpdmVkIGQ7CiAgICAvLyBVbnRpbCBoZXJlLCBldmVyeXRoaW5nIGNvbXBpbGVzIGZpbmUKICAgIGQuZG9TdHVmZigpOwogICAgLy8gRm9yIHNvbWUgcmVhc29uLCBJIGNhbid0IGFjY2VzcyB0aGUgZnVuY3Rpb24gcG9pbnRlcgogICAgLy9leGVjKCZkLCZEZXJpdmVkOjpkb1N0dWZmKTsKIGNvdXQgPDwgdHlwZWlkKCZEZXJpdmVkOjpkb1N0dWZmKS5uYW1lKCkgPDwgZW5kbCA8PCB0eXBlaWQoJkJhc2U6OmRvU3R1ZmYpLm5hbWUoKSA8PCBlbmRsOwoKcmV0dXJuIDA7CgoKCiAgICAKfQ==