Re: Почему нельзя предварительно объявить дружественную функ
От: Sm0ke Россия ksi
Дата: 25.09.23 12:03
Оценка: 12 (1)
Здравствуйте, Евгений Музыченко

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

#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


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

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