【问题标题】:c++ friend conversion functionc++好友转换函数
【发布时间】:2017-04-29 16:41:55
【问题描述】:

我注意到这个网页说用户定义的转化可以在关键字“朋友”之前

http://en.cppreference.com/w/cpp/language/cast_operator

可以包含除类型说明符或关键字之外的任何说明符 静态的,特别是,除了显式,说明符内联, virtual、friend 和 constexpr 也是允许的。

所以我尝试了一下,但似乎无法让朋友使用转换运算符(它提到的其他关键字确实有效)。

网页是否不正确,或者有没有办法使用朋友声明来做到这一点?

class t_friend_conversion_error
{
  public:
            operator int      ( ) ; //ok
  virtual   operator int *    ( ) ; //ok
  inline    operator int **   ( ) ; //ok
  constexpr operator int **** ( ) ; //ok

  friend    operator char     ( ) ; //error
} ; 

【问题讨论】:

  • 在类的转换函数上使用“朋友”不是没有意义,因为该转换函数已经可以访问作为类成员的私有部分吗? operator 关键字必须以其他类名作为前缀,以便朋友使用来授予额外的权限..

标签: c++ operator-keyword friend typeconverter


【解决方案1】:

您似乎不能拥有static operator char()。但不代表不能使用friend,只是放在辅助类中即可:

class t_conversion_helpers
{
    public:   
    operator char     ( ) ;
};

class t_friend_conversion_error
{
    public:
    operator int      ( ) ; //ok
    virtual   operator int *    ( ) ; //ok
    inline    operator int **   ( ) ; //ok
    constexpr operator int **** ( ) ; //ok
    friend    t_conversion_helpers::operator char     ( ) ; //ok
}; 

希望对你有帮助

【讨论】:

  • 感谢您的提示!您给出的示例是声明朋友函数,而不是定义转换,对吗?如果是这种情况,那么网页可能会从转换定义前缀列表中删除“朋友”,并将您的示例添加为方便的解决方法示例?会节省我的时间,也许可以帮助别人?
  • @MichaelCollier 我同意你的观点,参考文献中写的内容有点不清楚,但它仍然是正确的。参考的那一段谈论的是声明,而不是定义,它甚至引用了decl-specifier-seq
  • 很抱歉对 decl/defn 造成混淆。我的意思是,您的示例是声明了“朋友转换”还是使用了声明朋友函数的底层能力?
  • 为了澄清一点,我正在构建一个 GUI,允许用户从“朋友功能”、“转换”等实体构建类。所以我认为你的示例已经包含在GUI 能够构建一个友元函数,而不是我必须为 GUI 编写新代码来处理这种特殊类型的转换?
  • 参考文档已更新,包括一般声明友元函数和声明友元转换函数。他们提到需要在关键字friend前加上限定名称。
【解决方案2】:

您链接到的网页现在声明:“friend 需要限定名称:friend A::operator B();”。

【讨论】:

  • 而 A 将是某个类的名称,它不同于类“运算符 B()”的成员(为了让朋友使用才有意义)。
猜你喜欢
  • 1970-01-01
  • 2016-04-29
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多