C++ и дружба вложенных приватных классов

У меня есть 2 класса, как манекен ниже

   class CA
   {
   private:
    class Impl;
   };

   class Cb
   {
   private:
    friend class CA::Impl;
   }

Этот код дает мне ошибку компиляции, говорящую, что класс CA::Impl является закрытым. Неужели нельзя поставить дружбу для вложенных частных классов? Что еще я могу сделать, чтобы реализовать эту семантику?


person Abruzzo Forte e Gentile    schedule 03.06.2014    source источник
comment
Почему вы ожидаете, что это сработает? Ожидаете ли вы получить доступ к любому другому private члену CA?   -  person Praetorian    schedule 03.06.2014


Ответы (2)


Ты, Адам и Стив

Представьте себе знаменитость по имени Адам Стейки, у которой есть друг по имени Стив.

Разве не было бы странно, если бы вы, зная некоторые вещи об Адаме, хотя вы и не его друг, просто предположили, что вы и Стив достаточно близки, чтобы вы могли схватить его на публике?

Класс не является имплицитно другом друга или имплицитно другом чего-то, чего он может достигнуть в определенных частях.


Немного серьезнее

Чтобы ваш фрагмент работал, вам нужно либо

  • Сделать Cb другом CA, поместив предварительную и дружескую декларацию для Cb в CA, или;
  • сделать CA::Impl общедоступным, или;
  • любым другим способом убедитесь, что Cb может зацепиться за CA::Impl.
person Filip Roséen - refp    schedule 03.06.2014

Это возможно, но вам нужно сделать Cb другом CA, чтобы ему был разрешен доступ к его закрытым членам. Например:

class Cb;

class CA
{
   friend class Cb;

private:
   class Impl;
};

class Cb
{
private:
   friend class CA::Impl;
};
person dlf    schedule 03.06.2014