部分专业化的朋友声明

时间:2015-01-03 01:16:32

标签: c++ templates friend

在以下代码中:

template <typename U, typename V> class A {};
template <typename U, typename V> class B {};

template <typename T>
class C {
    template <typename U, typename V> friend class A;  // Works fine.
//  template <typename U> friend class B<U,T>;  // Won't compile.
};

我希望B<U,T>成为C<T>的朋友,也就是说,B的第二个参数必须与C&C的参数匹配,尽管它的第一个参数可以是任何参数。我该如何实现这一目标?朋友对A<U,V>的声明太多了,但如果我不能进一步限制它,我会接受它。

也许定义一个元函数

template <typename, typename = void> struct FriendTraits { struct type{}; };

或C中的类似内容?

前两行

template <typename, typename = void> struct FriendTraits { struct type{}; };
template <typename U> struct FriendTraits<U,T> { using type = B<U,T> ; }  ;
template <typename U> friend typename FriendTraits<U,T>::type;

编译,但不是重要的第3行(因为它是同样的问题)。

0 个答案:

没有答案