【问题标题】:Template parameter as a friend模板参数为好友
【发布时间】:2011-06-28 16:44:01
【问题描述】:

在 C++03 中,以下是非法的,尽管一些编译器支持它。

template <class T>
class X
{
    friend T;
};

这在 C++11 中是否合法化? (抱歉,没时间自己看草稿,希望有人知道)

【问题讨论】:

  • friend 对于 C++ 是正确的。
  • friends 用于 Facebook。
  • @Ken:我很高兴这不是为了电视节目 xD

标签: c++ templates c++11 friend


【解决方案1】:

来自 N3291 中的第 11.3、3 节:

template <typename T> class R {
  friend T;
};

R<C> rc; // class C is a friend of R<C>
R<int> Ri; // OK: "friend int;" is ignored

所以它在 C++11 中是合法的。

【讨论】:

  • 我很高兴friend int; 被忽略了:)
【解决方案2】:

是的,c++0x 允许模板参数成为朋友。

好吧,我碰巧记得以前在草稿中读过它,但找不到参考资料。.无论如何@Praetorian 的回答是肯定的。

【讨论】:

    【解决方案3】:

    在纯 C++ 中是非法的,但有一个简单的解决方法

    template <class T>
    class X
    {
        private:
            class Wrapper
            {
                public:
                    typedef T Type;
            };
            friend class Wrapper::Type;
    };
    

    【讨论】:

    • 适用于 gcc 但不适用于 VC2010 和 Comeau
    • 是的,在 Clang 上也试过了,但没用 :( - 显然标准禁止与 GCC 不检查的 typedef 类型成为朋友。但是允许写 friend T; GCC 无法识别,但 Clang 可以。
    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 2017-08-08
    • 2010-10-16
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多