朋友类的部分模板专业化?

时间:2017-05-27 06:31:16

标签: c++ templates partial friend

我有一个简单的类X,以及一组模板化的类Y< T,U>。我希望所有第一个模板化参数恰好是X的类Y成为X本身的朋友。以下希望能够传达我想要的东西,但是友元语句会产生编译错误。

template<typename T, typename U>
class Y {
};

class X {
    public:
        X(int value) : i(value) {}
        const int& getI()    const { return i; }
    private:
        int    i;
        template<class U> friend class Y<X,U>;
};

我不确定朋友声明的模板化是否允许(更不用说朋友声明的部分模板化)。有没有办法做到这一点?或者我是不是一个一个地列出了所有的朋友?

谢谢, 马特

2 个答案:

答案 0 :(得分:5)

cppreference.com上的friend declaration page指定:

  

朋友声明不能引用部分专业化,而可以引用完全专业化

因此,正如chtz所说,您可以有一个非局部专业朋友。

编辑:

另请参阅有关stackoverflow的另一个答案:https://stackoverflow.com/a/11046918/5776353

答案 1 :(得分:4)

对于问题的非部分部分,语法为:

class X {
    template<class T, class U> friend class Y;
};

我想,在大多数情况下,这应该足够了。

使用C ++ 11,您实际上可以成为模板化别名的朋友:

template<typename T, typename U>
class Y { };

class X {
    public:
        X(int value) : i(value) {}
        const int& getI()    const { return i; }
    private:
        int    i;
        template<class U> using YX = Y<X,U>;
        template<class U> friend class YX;
};

然而,这似乎不起作用(我不确定上面的朋友声明是否有任何效果)。