#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 несет чушь.