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