Функция-член Friend не может получить доступ к закрытому члену

#c #visual-c #intellisense #friend #access-control

#c #visual-c #intellisense #друг #управление доступом

Вопрос:

У меня есть следующее:

 class B;

class A
{
public:
    int AFunc(const Bamp; b);
};

class B
{
private:
    int i_;
    friend int A::AFunc(const Bamp;);
};

int A::AFunc(const Bamp; b) { return b.i_; }
  

Для определения AFunc я получаю, что член B::i_ недоступен. Что я делаю не так?

Компилятор: MSVC 2013.

Обновление: изменено AFunc на общедоступный, и теперь код компилируется. Однако я все еще получаю ошибку IntelliSense. Это проблема с IntelliSense?

Ответ №1:

Проблема в том, что вы объявляете private функцию другого класса как friend ! B обычно не должно быть никаких знаний о A закрытых функциях-членах. В G 4.9 сказано следующее:

 test.cpp:6:9: error: 'int A::AFunc(const Bamp;)' is private
     int AFunc(const Bamp; b);
         ^
test.cpp:13:33: error: within this context
     friend int A::AFunc(const Bamp;);
                                 ^
  

Чтобы решить эту проблему, просто объявите B в качестве друга A :

 class A
{
    friend class B;
private:
    int AFunc(const Bamp; b);
};
  

Вас может заинтересовать пример Microsoft.

Комментарии:

1. Точная цитата (если вы хотите ее добавить) из стандарта C 11 приведена в 11.3 / 9: Имя, назначенное объявлением friend, должно быть доступно в области видимости класса, содержащего объявление friend.

2. Спасибо! Я изменил AFunc на общедоступный (на самом деле он общедоступен в моем реальном коде). Теперь код компилируется, но я все еще получаю ошибку IntelliSense. Может быть, это проблема с IntellSense? Обновленный вопрос.

3. Код компилируется даже в -pedantic режиме. Я бы сказал, что IntelliSense несет чушь.