Ich möchte std::bind
zu einer Member-Funktion aus einer privaten Basisklasse, die mit einer using
-Deklaration in der abgeleiteten Klasse "public" gemacht. Der Aufruf der Funktion direkt funktioniert, aber es scheint Bindung oder Mitglied Funktionszeiger mit nicht kompiliert:Bindung an privat geerbt Mitglied Funktion
#include <functional>
struct Base {
void foo() { }
};
struct Derived : private Base {
using Base::foo;
};
int main(int, char **)
{
Derived d;
// call member function directly:
// compiles fine
d.foo();
// call function object bound to member function:
// no matching function for call to object of type '__bind<void (Base::*)(), Derived &>'
std::bind(&Derived::foo, d)();
// call via pointer to member function:
// cannot cast 'Derived' to its private base class 'Base'
(d.*(&Derived::foo))();
return 0;
}
oben bei den Fehlermeldungen Blick scheint das Problem zu sein, dass Derived::foo
noch Base::foo
ist einfach, und ich kann‘ t Zugang Base
durch Derived
außerhalb Derived
selbst.
Dies scheint inkonsistent - sollte ich nicht in der Lage sein, direkte Aufrufe, gebundene Funktionen und Funktionszeiger austauschbar zu verwenden?
Gibt es eine Abhilfe, die mich zu foo
auf ein Derived
Objekt binden lassen würde, vorzugsweise ohne Base
oder Derived
Wechsel (die in einer Bibliothek, die ich nicht gehört)?
Als (etwas hässlicher) Workaround könnten Sie ein Lambda '[& d]() {d.foo(); } '. – Holt