Вопрос о функциях друзей - PullRequest
1 голос
/ 21 февраля 2011

Недавно я столкнулся с проблемой со сторонней библиотекой, которая генерирует классы из xml. Вот суть этого:

class B;
class A
{
    void doSomething();
    friend class B; 
};

class B
{
    void doSomething();
    void doSomethingMore()
    {
        doSomething();
    }
};

Компилятор помечает вызов функции doSomething() как неоднозначный и помечает ее как ошибку компилятора. Легко понять, почему он выдает ошибку. Class B, являясь другом class A, каждый член class B имеет доступ ко всем членам class A. Переименование любой из функций решило мою проблему, но я подумал, что в этом случае компилятор не должен отдавать приоритет собственной функции-члену класса над функцией в другом классе, другом которого он является?

Примечание. Завтра я обновлю сведения о версии компилятора. Нужно проверить точные сведения о версии на рабочем месте. Я думаю, я должен был получить их в первую очередь ..: (

[Обновление и разрешение проблем]
Я проверил снова с небольшим примером программы, и моя проблема заключается не в неоднозначности из-за функций друзей. Сторонняя библиотека внутренне генерирует функцию с той же сигнатурой и внутри того же класса, что вызывает неоднозначность. Спасибо за ответы, по крайней мере, мое заблуждение было исправлено :)

Ответы [ 2 ]

3 голосов
/ 21 февраля 2011

Нет никакой двусмысленности.Функция, вызываемая в A, требует экземпляра A.Для функции, вызываемой в B, требуется экземпляр B.

doSomethingMore вызывается для экземпляра B, и поэтому вызываемая функция - это функция из B.

Кажется, вы неправильно поняли дружбу.Все это означает, что в этом случае, учитывая экземпляр A, функции-члены B могут вызывать функцию A :: doSomething () или делать что-либо еще в A, которое имеет частный доступ.

0 голосов
/ 21 февраля 2011

В вашем примере нет абсолютно никакой двусмысленности.Подружка одного класса с другим не оказывает такого влияния на поиск имени, который вы описываете.Объяснение «Легко понять ...» не имеет большого смысла с языковой точки зрения.

Хотя возможно, что сломанный компилятор может вести себя так, как вы описали, скорее всего, вы что-то пропустили, и причина неоднозначности другая.

...