我有两个参数化的类,并希望在它们之间传输私有信息。两次尝试:
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]
(不是错误,但未授予转让友情),而一种非成员方法(staticxfer
)则导致错误错误error: call to 'staticxfer' is ambiguous
(对我来说很奇怪:我希望staticxfer
成为各种事物的朋友,友谊应该是累积的,而不是模棱两可的。)
什么是干净的方法?
(当然,这只是代码的一部分;在实践中,我有7个不同的参数化类,并且想要将数据从任何一个传递到任何其他的类,对数据进行不重要的修改并使用的私有函数两者)。
答案 0 :(得分:2)
让整个课程模板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);
}