【问题标题】:partial template specialization for friend classes?朋友类的部分模板专业化?
【发布时间】:2017-05-27 06:31:16
【问题描述】:

我有一个简单的 X 类和一组模板化类 Y。我希望第一个模板化参数恰好是 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>;
};

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

谢谢, 马特

【问题讨论】:

标签: c++ templates partial friend


【解决方案1】:

cppreference.com 上的friend declaration page 指定:

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

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

编辑:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回复。我选择了您详细介绍的非部分方法。虽然它结交了比需要更多的朋友,但所有的 Y 班都是我所做的幕后工作,所以应该不是什么大问题。感谢您的语法。我也试过你的非部分方法。奇怪的是,它编译了,但实际上并没有如愿实现友谊。不知道它在做什么。
    • @fk0 第一部分应该可以工作。如果不是,您使用的是什么编译器/参数?第二部分没有效果,就像我写的那样。
    猜你喜欢
    • 2011-05-26
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2015-07-04
    • 2016-10-29
    • 1970-01-01
    相关资源
    最近更新 更多