繁体   English   中英

条件运算符无法解析重载的成员函数指针

[英]Conditional operator can't resolve overloaded member function pointers

我在处理C ++中重载成员函数的指针时遇到了一个小问题。 以下代码编译正常:

class Foo {
public:
    float X() const;
    void X(const float x);
    float Y() const;
    void Y(const float y);
};

void (Foo::*func)(const float) = &Foo::X;

但是这不会编译(编译器抱怨重载是不明确的):

void (Foo::*func)(const float) = (someCondition ? &Foo::X : &Foo::Y);

大概这与编译器分离出条件运算符的返回值和函数指针类型有关吗? 我可以解决它,但我很想知道规范如何说这一切应该工作,因为它似乎有点不直观,如果有一些方法可以解决它而不会回到5行if-then-else 。

我正在使用MSVC ++,如果这有任何区别。

谢谢!

从第13.4 / 1节(“重载功能的地址”,[over.over]):

在某些上下文中使用不带参数的重载函数名称解析为函数,指向函数的指针或指向来自重载集的特定函数的成员函数的指针。 函数模板名称被认为是在这种上下文中命名一组重载函数。 选择的函数是其类型与上下文中所需的目标类型匹配的函数。 目标可以是

  • 正在初始化的对象或引用(8.5,8.5.3),
  • 任务的左侧(5.17),
  • 函数的参数(5.2.2),
  • 用户定义的运算符的参数(13.5),
  • 函数,运算符函数或转换的返回值(6.6.3),或
  • 显式类型转换(5.2.3,5.2.9,5.4)。

过载函数名称可以以&运算符开头。 如果没有参数,则不应在除列出的上下文之外的上下文中使用重载的函数名称。 [ 注意:忽略重载函数名称周围的任何多余括号(5.1)。 ]

您希望从上面的列表中选择的目标是第一个,正在初始化的对象。 但是有一个条件运算符,条件运算符从它们的操作数确定它们的类型,而不是从任何目标类型。

由于显式类型转换包含在目标列表中,因此可以分别在条件表达式中类型转换每个成员指针表达式。 我先做一个typedef:

typedef void (Foo::* float_func)(const float);
float_func func = (someCondition ? float_func(&Foo::X) : float_func(&Foo::Y));

例:

class Foo {
public:
    void X(float x) {}
    void Y(float y)  {}
    float X() const;
};
typedef void (Foo::*Fff)(float);
Fff func = &Foo::X;
Fff func2 = true ? (Fff)&Foo::X : (Fff)&Foo::Y;

int main(){
    return 0;
}

您需要立即转换&Foo :: X以解决过载问题。 请注意,如果注释掉重载的浮点X(),则不需要这样做。

看起来编译器不够智能来推断三元表达式所需的返回类型(这可能是一个错误)。

尝试:

    void (Foo::*func1)(const float) = &Foo::X;
    void (Foo::*func2)(const float) = &Foo::Y;

    void (Foo::*func3)(const float) = (someCondition ? func1:func2);

问题是运算符trinary的结果类型由其参数决定。
在这种情况下,它无法确定结果类型,因为输入类型具有多个选项。 直到三元运算符的类型被确定它将尝试分配。

暂无
暂无

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

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