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

2023-12-22

我在处理 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++,如果这有什么区别的话。

Thanks!


来自第 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)。

重载函数名称前面可以带有&操作员。在未列出的上下文中,不得在没有参数的情况下使用重载函数名称。 [Note:重载函数名称周围的任何冗余括号都将被忽略 (5.1)。 ]

The target您希望从上面的列表中选择第一个,即正在初始化的对象。但是有一个条件运算符阻碍了这一过程,条件运算符根据其操作数而不是任何目标类型来确定其类型。

由于显式类型转换包含在目标列表中,因此您可以单独对条件表达式中的每个成员指针表达式进行类型转换。我首先创建一个 typedef:

typedef void (Foo::* float_func)(const float);
float_func func = (someCondition ? float_func(&Foo::X) : float_func(&Foo::Y));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Spring 和 /* url 模式

    我们有一个 的 url 模式并且请求到达我们的控制器 但我们总是得到 404 这是我们的 web xml
  • 谷歌面积图线下可变不透明度?

    我正在使用谷歌图表中的面积图 我想知道是否有办法设置每条线的不透明度 看这个例子 https developers google com chart interactive docs gallery areachart hl nl Simp
  • 如果参数为 NULL,如何从 WHERE 子句中删除条件

    我将 2 个参数传递给 PL pgSQL 函数 这是查询 SELECT FROM table WHERE col1 param1 AND col2 param2 两个参数都可以为 NULL 在这种情况下 应从WHERE clause 我怎样
  • 带 2 个按钮的警报

    我将在我的应用程序中添加一个指向网站的链接 用户将单击一个显示 网站 的按钮 然后将出现一个带有 2 个按钮的警报 其中一个按钮只是取消按钮 另一个按钮将打开网站 你能帮我解决这个问题吗 Thanks 将其放入您的头文件中 interfac
  • 使用互斥锁时尝试引用已删除的函数

    我在处理项目时遇到奇怪的错误 我创建了一个超级简单的示例来重现错误 我创建了一个类 我想在这个类中做的是为我的类提供一种 getter 函数来填充 a 的值struct 在主应用程序中 用户将实例化这个struct 将其传递给成员函数 并能
  • Z3 Solver Java API:意外行为

    通过向求解器添加条件 我想使用 solver check 检查是否存在解 因此 我创建了一个简单的示例来寻找 t1 的解决方案 我知道 t1 有一个解 即 t1 0 然而 求解器的状态不是 SATISFIABLE public static
  • 将 base64 字符串转换为与 OpenCV 兼容的图像

    我正在尝试将 JPEG 的 Base64 表示形式转换为可与 OpenCV 一起使用的图像 问题是我希望能够做到这一点而不必物理保存照片 我希望它保留在内存中 有更新的方法来实现这一点吗 我正在使用 python 3 6 2 和 OpenC
  • ZMQ套接字连接超时

    我正在使用 ZMQ cppzmq 的 C 绑定 并且尝试使用以下命令设置 TCP 套接字的连接超时 setsockopt 这样的方法 int connectTimeout 1000 socket setsockopt ZMQ CONNECT
  • 替换对shared_ptr中对象的所有引用

    是否可以替换shared ptr的多个实例引用的对象 可能我不太清楚 我举个例子 shared ptr a new Derived1 auto b a auto c b This function replaces the object w
  • TypeError 对象不可迭代

    当尝试循环 Django 模板中的变量时 出现以下错误 有问题的变量是我的 DetailView 子类中指定的模型的相关对象 类型错误位于 en applicants 50771459778 Householdmember 对象不可迭代 这
  • 如何在 PHP 中通过 cURL 发送 XML 和其他 post 参数

    我使用下面的代码将 XML 发送到我的 REST API xml string data 包含正确的 XML 并且它很好地传递到 mypi php set POST variables url http www server cu mypi
  • 解释器关闭时线程化导入

    蟒蛇的threading文档 http docs python org dev library threading html importing in threaded code states 所有导入尝试必须在解释器启动之前完成 自行关闭
  • 线程最佳实践

    我从事的许多项目的线程实现都很差 而我就是必须追踪这些问题的傻瓜 是否有公认的最佳方法来处理线程 我的代码总是等待一个永远不会触发的事件 我有点像设计模式之类的想法 假设 NET 类似的事情也适用于其他平台 嗯 有lots需要考虑的事情 我
  • 如何检测脚本中的Python版本2或3?

    我编写了一些脚本 它们要么仅在 Python 2 x 版本上运行 要么仅在 Python 3 x 版本上运行 如果脚本是从合适的 Python 版本开始的 我如何检测脚本内部 有没有类似这样的命令 major minor getPython
  • 为什么 MPI_Barrier 会导致 C++ 中的分段错误

    我已将程序简化为以下示例 include
  • 在 Drupal 8 中的特定节点类型上使用预处理钩子

    我已经成功使用预处理页面挂钩 例如 function mytheme preprocess page node front variables and function mytheme preprocess page node 12 var
  • 如何在 foreachBatch 中使用临时表?

    我们正在构建一个流平台 其中批量使用 SQL 至关重要 val query streamingDataSet writeStream option checkpointLocation checkPointLocation foreachB
  • 从具有复合主键的另一个表插入或更新表

    我正在寻找正确的语法和方法来直接从 SQL 执行以下操作 插入或更新 如果数据已存在 TableMain从包含的数据TableA两者具有相同的复合主键 两个表都定义为 CREATE TABLE TableA TID0 int NOT NUL
  • 如何使用 Moya Swift 使用多部分请求上传图像?

    我使用的是 Moya 10 0 1 当我尝试将图像上传到服务器时遇到问题 我确实遵循了分段上传示例 https github com Moya Moya blob master docs Examples MultipartUpload m
  • 条件运算符无法解析重载的成员函数指针

    我在处理 C 中重载成员函数的指针时遇到了一个小问题 以下代码可以正常编译 class Foo public float X const void X const float x float Y const void Y const flo