Доступ к защищенным членам производного класса с помощью CRTP

0

Я использую 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 невозможно для меня!

  • 1
    Поставь friend class A<B>; в B .
  • 0
    Использование любых ключевых слов в B для меня невозможно.
Показать ещё 2 комментария
Теги:
friend
friend-function
crtp

2 ответа

2
Лучший ответ

Я только нашел решение. Спасибо за ответы. Мне просто нужно изменить эту строку:

s._method( s); //ERROR, because _method is protected

в

( ( A< Self> &) s)._method( s);

И это работает! http://ideone.com/CjclqZ

0
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.

  • 0
    Это не работает ideone.com/8cODOC .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню