我需要一个模板专用类来使friend
与另一个模板专用类。
示例:
template <class A, class B>
class X { };
template <class A, class B>
class Y { };
现在我希望仅这些模板类的某些特定专业成为朋友:
我试过
template <class A>
class X <A, bool> { };
template <class A>
class Y <A, bool>
{
// X<A, bool> shall be friend!
template<class _C> using X_partial = X<_C,bool>;
template<class _D> friend class X_partial;
};
这个,
template <class A>
class X <A, bool> { };
template <class A>
class Y <A, bool>
{
// X<A, bool> shall be friend!
template<class C> friend class X<class C,bool>
};
但两者都给出了错误。
语法可以支持C ++(03),C ++ 11或C ++ 14。
答案 0 :(得分:1)
朋友声明不能声明部分专业化。请参阅here。
朋友声明不得声明部分专业化。 [实施例:
template<class T> class A { }; class X { template<class T> friend class A<T*>; // error };
- 结束示例]
然而,如果&#34;初始&#34; A
的类型是相同的,然后为正确的专业化提供友谊,它如下;
template <class A, class B>
class Y { };
template <class A, class B>
class X {
public:
// fails to compile when instantiated
//X() { Y<A, bool> y; y.i = 42; }
};
template <class A>
class Y <A, bool>
{
// partial specialisation provided friendship
friend class X<A, bool>;
int i = 0;
};
template <class A>
class X <A, bool> {
public:
X() { Y<A, bool> y; y.i = 42; }
};
int main()
{
X<int, bool> x1;
// fails to compile.
X<int, int> x2;
}
答案 1 :(得分:0)
问题出在哪里?在问这个问题之前你有什么尝试?
// Templated class X
template <class A, bool>
class X {
};
// Templated class Y
template <class A, bool>
class Y {
// Any specialized A is a friend of any specialized B
template <class B, bool> friend class X;
};
修改:使用您在评论问题时提供的课程进行更新。