我该如何为朋友模板化?

时间:2019-03-18 16:32:28

标签: c++ c++11 templates

我有两个参数化的类,并希望在它们之间传输私有信息。两次尝试:

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个不同的参数化类,并且想要将数据从任何一个传递到任何其他的类,对数据进行不重要的修改并使用的私有函数两者)。

1 个答案:

答案 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);
}