Как я могу иметь шаблонных друзей? - PullRequest
1 голос
/ 18 марта 2019

У меня есть два параметризованных класса, и я хочу передать личную информацию между ними.Две попытки:

template<int I> class athing;

template<int J> class bthing {
  int data[J];
 public:
  template<int I> friend void athing<I>::transfer(const bthing &);
  template<int I> friend void staticxfer(athing<I> &, const bthing &);
};

template<int I> class athing {
  int data[I];
 public:
  template<int J> void transfer(const bthing<J> &a) {
    data[0] = a.data[0];
  }
  template<int J> friend void staticxfer(athing &a, const bthing<J> &b) {
    a.data[0] = b.data[0];
  }
};

int main() {
  athing<10> a;
  bthing<10> b;

  a.transfer(b);
  staticxfer(a, b);
}

При использовании метода-члена один (transfer) возникает ошибка warning: dependent nested name specifier 'athing<I>::' for friend class declaration is not supported; turning off access control for 'bthing' [-Wunsupported-friend] (не ошибка, но передача не была предоставлена ​​дружба), в то время как метод не-член один (* 1006)*) вызывает ошибку error: call to 'staticxfer' is ambiguous (что для меня странно: я хочу, чтобы staticxfer дружил со всем, что угодно, дружба должна быть кумулятивной, а не двусмысленной).

Что такое чистый способ сделатьthis?

(конечно, это небольшой кусочек кода; на практике у меня есть 7 различных параметризованных классов, и я хочу перенести данные из любого в любой другой, выполняя нетривиальные изменения данныхи используя частные функции обоих).

1 Ответ

2 голосов
/ 18 марта 2019

Сделать весь шаблон класса athing другом:

template<int J> class bthing {
    // ...
    template<int I> friend class athing;
};

staticxfer не обязательно быть другом, поскольку он может повторно использовать athing::transfer.

template<int J> friend void staticxfer(athing &a, const bthing<J> &b) {
    a.transfer(b);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...