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

partial template specialization for friend classes?

我有一个简单的 class X 和一组模板化的 classes Y。我希望第一个模板化参数恰好是 X 的所有 classes Y 成为 X 本身的朋友。下面希望传达我想要的,但是 friend 语句给出了编译错误。

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

我不确定是否允许友元语句模板化(更不用说友元语句的部分模板化了)。有没有办法做到这一点?还是我把所有的朋友都一一列出来了?

谢谢, 马特

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

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

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

cppreference.com 上的 friend declaration page 指定:

Friend declarations cannot refer to partial specializations, but can refer to full specializations

所以chtz说你可以有一个不偏科的朋友

编辑:

另请参阅 Whosebug 上的另一个答案: