如何将部分专业模板类的朋友变成另一个部分专用的模板类?

时间:2017-07-13 07:46:16

标签: c++ c++11 templates c++14 template-specialization

我需要一个模板专用类来使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。

2 个答案:

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

Sample online

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

修改:使用您在评论问题时提供的课程进行更新。