繁体   English   中英

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

[英]partial template specialization for friend classes?

我有一个简单的 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>;
};

我不确定是否允许对朋友语句进行模板化(更不用说对朋友语句进行部分模板化了)。 有没有办法做到这一点? 还是我被卡在一张一张地列出所有朋友?

谢谢,马特

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

友元声明不能引用部分特化,但可以引用完全特化

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

编辑:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM