朋友课程的部分模板专业化?

Mat*_*che 5 c++ templates friend partial

我有一个简单的类X,还有一组模板化类Y <T,U>。我希望所有第一个模板化参数恰好是X的类Y都成为X本身的朋友。以下希望传达出我想要的内容,但是Friendly语句给出了编译错误。

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>;
};
Run Code Online (Sandbox Code Playgroud)

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

谢谢,马特

Pie*_*rre 6

cppreference.com上的好友声明页面指定:

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

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

编辑:

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


cht*_*htz 5

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

class X {
    template<class T, class U> friend class Y;
};
Run Code Online (Sandbox Code Playgroud)

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


使用 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;
};
Run Code Online (Sandbox Code Playgroud)

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