Информация об изменениях

Сообщение Re: Почему нельзя предварительно объявить дружественную функ от 25.09.2023 12:03

Изменено 25.09.2023 12:11 Sm0ke

Re: Почему нельзя предварительно объявить дружественную функцию-член?
Здравствуйте, Евгений Музыченко

Если имя метода, который вы хотите указать как friend, сделать зависимым от шаблонного параметра, то
разрешение имён откладывается до мемента инстанцирования.

Про это есть видео на ютуб канале Константина Владимирова
  Магистерский курс C++ (МФТИ, 2022-2023). Лекция 4. Разрешение имён в шаблонах и One Definition Rule.
https://www.youtube.com/watch?v=8mCSDR1NpoU


Может быть вам это поможет, только тут придётся принимать класс, который с дружесвенным методом, как параметр шаблона.


#include <iostream>

template <typename T>
struct restricted
{
  friend void T::go(const restricted &) const;
private:
  int value{55};
};

struct agent
{
  template <typename T>
  void go(const T & r) const
  {
    std::cout << r.value << '\n';
  }
};

int main()
{
  restricted<agent> v;
  agent a;
  a.go(v);
  return 0;
}

Output:

55

Re: Почему нельзя предварительно объявить дружественную функ
Здравствуйте, Евгений Музыченко

Если имя метода, который вы хотите указать как friend, сделать зависимым от шаблонного параметра, то
разрешение имён откладывается до мемента инстанцирования.

Про это есть видео на ютуб канале Константина Владимирова
  Магистерский курс C++ (МФТИ, 2022-2023). Лекция 4. Разрешение имён в шаблонах и One Definition Rule.
https://www.youtube.com/watch?v=8mCSDR1NpoU

Вы хотите указать метод того класса, который ещё не определён как дружественный?
Если этот класс, который с дружесвенным методом, принимать как параметр шаблона, то это может получится

#include <iostream>

template <typename T>
struct restricted
{
  friend void T::go(const restricted &) const;
private:
  int value{55};
};

struct agent
{
  template <typename T>
  void go(const T & r) const
  {
    std::cout << r.value << '\n';
  }
};

int main()
{
  restricted<agent> v;
  agent a;
  a.go(v);
  return 0;
}

Output:

55