Я использую CRTP, и у меня есть проблема с доступом к защищенным членам производного класса.
Вот пример, близкий к моему коду:
template< typename Self>
class A {
public:
void foo( ) {
Self s;
s._method( s); //ERROR, because _method is protected
}
protected:
virtual void _method( const Self & b) = 0;
};
class B : public A< B> {
protected:
void _method( const B & b) {}
};
Я понял, что должен использовать ключевое слово friend. Но я не могу понять, где положить его в класс A <Self>. Я знаю, что я мог бы сделать void _method (const B & b) общедоступным в B, но я не хочу этого делать. Использование любых ключевых слов в B невозможно для меня!
Я только нашел решение. Спасибо за ответы. Мне просто нужно изменить эту строку:
s._method( s); //ERROR, because _method is protected
в
( ( A< Self> &) s)._method( s);
И это работает! http://ideone.com/CjclqZ
template< typename Self>
class A {
public:
void foo( ) {
Self s;
s._method( s); //ERROR, because _method is protected
}
protected:
virtual void _method( const Self & b) = 0;
};
template< typename Self>
class B : public A< Self> {
protected:
void _method( const Self & b) {}
};
Сделайте это таким образом; В вашем классе A-метод является чисто виртуальным, и вы должны переопределить его в классе B.
friend class A<B>;
вB
.