Отказ от ответственности: Это отвечает на вопрос в том виде, в котором оно было задано, но, на мой взгляд, предпочтительнее использовать другой подход к проектированию, поэтому я не рекомендую делать это на производстве, если только вам это не нужно.
Вы можете обойти это, злоупотребляя тем фактом, что производным классам разрешен доступ к protected
статическим членам их родительских классов:
#include <iostream>
template<typename Derived>
class Base {
protected:
static void fct1(Base* self){
static_cast<Derived*>(self)->topfunc();
}
void fct2() {}
};
class DerivedImpl: public Base<DerivedImpl> {
void callbase() { fct1(this); }
void topfunc() { std::cout << "topfunc" << std::endl; }
friend void Base<DerivedImpl>::fct1(Base*); // works fine now!
};