CRTP с защищенным производным членом

В шаблоне 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 .

24
задан amit 15 December 2011 в 17:28
поделиться