У меня есть два параметризованных класса, и я хочу передать личную информацию между ними.Две попытки:
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 различных параметризованных классов, и я хочу перенести данные из любого в любой другой, выполняя нетривиальные изменения данныхи используя частные функции обоих).