В CRTP-шаблоне мы сталкиваемся с проблемами, если хотим сохранить функцию реализации в производном классе как защищенную. Мы должны либо объявить базовый класс как друга производного класса, либо использовать что-то вроде этого (я не пробовал метод в связанной статье), Есть ли другой (простой) способ, позволяющий сохранить функцию реализации в производном классе как защищенный?
Изменить: Вот простой пример кода:
template<class D>
class C {
public:
void base_foo()
{
static_cast<D*>(this)->foo();
}
};
class D: public C<D> {
protected: //ERROR!
void foo() {
}
};
int main() {
D d;
d.base_foo();
return 0;
}
Приведенный выше код дает error: ‘void D::foo()’ is protected
с g++ 4.5.1, но компилируется, если protected
заменяется на public
.