Operator= 和 C++ 中未继承的函数?

2024-02-07

在我刚刚进行的测试之前,我认为在 C++ 中只有构造函数不被继承。但显然,任务operator=是不是太...

  1. 这是什么原因呢?
  2. 是否有任何解决方法来继承赋值运算符?
  3. 是否也是如此operator+=, operator-=, ... ?
  4. 所有其他函数(除了构造函数/运算符=)都是继承的吗?

事实上,我在做一些 CRTP 时遇到了这个问题:

template<class Crtp> class Base
{
    inline Crtp& operator=(const Base<Crtp>& rhs) {/*SOMETHING*/; return static_cast<Crtp&>(*this);}
};

class Derived1 : public Base<Derived1>
{
};

class Derived2 : public Base<Derived2>
{
};

有什么解决方案可以让它发挥作用吗?

编辑:好的,我已经隔离了问题。为什么以下不起作用?如何解决问题?

#include <iostream>
#include <type_traits>

// Base class
template<template<typename, unsigned int> class CRTP, typename T, unsigned int N> class Base
{
    // Cast to base
    public:
        inline Base<CRTP, T, N>& operator()()
        {
            return *this;
        }

    // Operator =
    public:
        template<typename T0, class = typename std::enable_if<std::is_convertible<T0, T>::value>::type>
        inline CRTP<T, N>& operator=(const T0& rhs)
        {
            for (unsigned int i = 0; i < N; ++i) {
                _data[i] = rhs;
            }
            return static_cast<CRTP<T, N>&>(*this);
        }

    // Data members
    protected:
        T _data[N];
};

// Derived class
template<typename T, unsigned int N> class Derived : public Base<Derived, T, N>
{
};

// Main
int main()
{
    Derived<double, 3> x;
    x() = 3; // <- This is OK
    x = 3;   // <- error: no match for 'operator=' in ' x=3 '
    return 0;
}

赋值运算符在技术上是继承的;但是,它始终被派生类的显式或隐式定义的赋值运算符隐藏(请参阅下面的注释)。

(13.5.3 赋值)赋值运算符应由 仅有一个参数的非静态成员函数。因为副本 赋值运算符operator=为 a 类隐式声明,如果 未由用户声明,基类赋值运算符始终 被派生类的复制赋值运算符隐藏。

您可以实现一个虚拟赋值运算符,它只需将调用转发到基类operator=, 像这样:

// Derived class
template<typename T, unsigned int N> class Derived : public Base<Derived, T, N>
{
public:
    template<typename T0, class = typename std::enable_if<std::is_convertible<T0, T>::value>::type>
    inline Derived& operator=(const T0& rhs)
    {
        return Base<Derived, T, N>::operator=(rhs);
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Operator= 和 C++ 中未继承的函数? 的相关文章

  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • 非模板函数中的尾随返回类型[重复]

    这个问题在这里已经有答案了 我见过有人使用以下语法来实现函数 auto get next gt int 代替 int get next 我理解两者 并且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用 就我个人而言 我会避
  • 无法在 CUDA 中找到 1 到 100 数字的简单和?

    我正在研究使用 CUDA 的图像处理算法 在我的算法中 我想使用 CUDA 内核找到图像所有像素的总和 所以我在cuda中制作了内核方法 来测量16位灰度图像的所有像素的总和 但我得到了错误的答案 所以我在cuda中编写了一个简单的程序来查
  • 如何从经过身份验证的 SecurityToken 中获取声明

    我将令牌作为字符串传递到 SOAP 服务中 并验证了该令牌是否有效 我现在有一个 SecurityToken 在调试模式下我可以看到所有声明 特别是我想传递到另一个方法的 userId 声明 我似乎不知道如何获得这些索赔 现在 我解码了令牌
  • Windows Phone 7 - ScrollViewer 值已更改

    我一直在寻找解决方案 但无法找到正确的解决方案 我的网格宽度为 960 并且有ScrollViewer在里面 现在我想知道滚动时滚动的值 水平偏移 我找到的所有解决方案都是针对 wpf silverlight 的 它对我不起作用 Edit
  • 从图像创建半透明光标

    是否可以从图像创建光标并使其半透明 我目前正在拍摄自定义图像并覆盖鼠标光标图像 如果我可以将其设为半透明 那就太好了 但不是必需的 销售人员喜欢闪亮的 目前正在做这样的事情 Image cursorImage customImage Get
  • X 轴和 Z 轴上的 Quaternion.Slerp,无 Y 轴

    I am trying to rotate the Player about X Y and Z axis The Y axis should not move from last angle Example if I rotate 45
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • Typescript 继承:扩展基类对象属性

    当扩展一个类时 我可以轻松地向它添加一些新属性 但是 如果当我扩展基类时 我想向基类的对象 简单对象的属性 添加新属性怎么办 这是一个带有一些代码的示例 基类 type HumanOptions alive boolean age numb
  • C# 可以为控制台应用程序部分类“程序”类吗?

    我想知道是否可以将为任何控制台应用程序创建的默认 程序 类更改为部分类 我想这样做是因为我想要更好的组织 而不是将所有方法都放在按区域分类的 1 个文件中 对我来说 将某些方法类别放在单独的文件中会更有意义 我对分部类的理解是 它是多个文件
  • 将 AutomationID 与 ListView 结合使用

    我正在尝试将 AutomationId 附加到列表视图中的项目 理想情况下 将项目名称绑定到显示的项目
  • 让 Windows 尝试读取文件

    我正在对 Windows 文件系统进行某种封装 当用户请求打开文件时 Windows 调用我的驱动程序来提供数据 在正常操作中 驱动程序返回缓存的文件内容 但是 在某些情况下 实际文件没有缓存 我需要从网络下载它 问题是是否有可能让 Win
  • c++ - <未解析的重载函数类型>

    在我的班级里叫Mat 我想要一个将另一个函数作为参数的函数 现在我有下面 4 个函数 但是在调用 print 时出现错误 第二行给了我一个错误 但我不明白为什么 因为第一行有效 唯一的区别是功能f不是班级成员Mat but f2是 失败的是
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整
  • C++ 中的析构函数

    我的 AB h 文件中有一个构造函数 class AB private int i public AB i 0 constructor AB i 0 destructor virtual void methodA unsigned int
  • 如何将模型绑定到动态创建的类 nancyfx

    首先感谢任何愿意查看我的问题的人 我对 Nancyfx 还很陌生 在尝试将 JSON 有效负载绑定到动态创建的类时遇到问题 我按照这篇文章中的代码动态创建了该类 在C 中动态创建一个类 https stackoverflow com que
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS
  • 如何使用 Microsoft Graph API 更新 MailboxSettings

    我想从不同的日历更新邮箱设置 如何构建可以通过 Microsoft Graph 更新 MailboxSetting 的请求 这是我的代码示例 但有例外 代码示例 User obj GraphServiceClient Users roomC

随机推荐

  • 由于延迟加载而使用 Pony ORM 的 DatabaseSessionIsOver?

    我正在使用 Pony ORM 作为烧瓶解决方案 并且遇到了以下问题 考虑以下 db session def get orders of the week self user date q select o for o in Order fo
  • 同步块和监视器对象

    您好 有人可以解释一下下面的代码中的同步代码是否会限制对线程的访问 如果是的话 它与我们使用 this 而不是 msg 作为监视对象有什么不同 public void display String msg synchronized msg
  • 使用 C 中的 GLib/GIO 从 Web 获取文件

    我应该使用什么函数使用 GLib GIO 库从网络获取文件 如果我的文件来自 gchar path http xxx yyyServer sharing temp txt 我应该怎么做才能下载它 对于本地文件 我只使用 fopen 和 fr
  • 理解Python内存分配和释放

    我最近遇到本文 http deeplearning net software theano tutorial python memory management html关于python内存分配 在这个页面中 它描述了 python 的内存使
  • 在 R 中进行矩阵乘法时的非一致性数组

    我正在尝试在 R 中实现内核岭回归 公式为 alpha lt lambda I K 1 y 拉姆达 0 1 I 与 K 大小相同的单位矩阵 y 是与 K 具有相同行数的特征向量 所以我在 R 中尝试了这个 I lt diag nrow df
  • 如何将 AWS Glue 作业的输出返回到调用 Step Function 工作流程?

    AWS Step Functions 允许调用 AWS Glue 作业 如下所述 https docs aws amazon com step functions latest dg connect glue html https docs
  • 合并冲突解决

    当 Git 中出现合并冲突时 如下所示的垃圾会被插入到冲突的文件中 三个问题 你如何阅读这些注释 解决这些合并冲突时可以使用哪些策略 是否有适用于 Mac 的 GUI 工具知道如何读取这些文件并并排显示两个版本 以便更轻松地解决问题 注意
  • 如何从 Composer 中全局删除包?

    我运行此命令进行全局安装PHPUnit composer global require phpunit phpunit 3 7 现在我想全局卸载PHPUnit 有任何想法吗 要删除全局安装的包 请运行 composer global rem
  • 如何保持 ARKit SCNNode 就位

    嘿 我正在想办法 如何保持简单节点的位置 当我在 ARKit 中绕着它走动时 Code func renderer renderer SCNSceneRenderer didAdd node SCNNode for anchor ARAnc
  • 有没有一种简单的方法来枚举 Base 中数组的索引?

    有时人们想要循环遍历数组的索引 例如 假设我想创建一个嘈杂的乘法表 首先 创建一些噪音 julia gt m 0 1 rand 2 3 2 3 Matrix Float64 0 0692654 0 0297861 0 0642931 0 0
  • Android-相对布局中ScrollView中的LinearLayout

    我的布局有点问题 我制作了RelativeLayout 其中放置了两个LinearLayout 1 和2 并在它们之间放置了带有LinearLayout 的ScrollView 接下来 我将 ScrollView 设置为放置在 Linear
  • Int64 创建数字范围

    我需要能够创建顺序长度超过 19 位的数字范围 我尝试使用 Enumerable Range 120000003463014 50000 ToList 这适用于较小的数字 但使用上面的代码时 我收到一条错误消息 指出它对于 int32 数字
  • SQL Server 2008根据机器设置获取DATETIMEOFFSET

    在 SQL Server 2008 R2 上 我有以下 T SQL 代码 SELECT CAST GETDATE AS DATETIMEOFFSET 这给了我如下结果 2011 12 26 10 21 13 7970000 00 00 但结
  • Apache Camel onException

    我想捕获路由中的所有异常 我添加这个 OnException onException Exception class process new MyFunctionFailureHandler stop 然后 我创建 MyFunction F
  • Heroku 与 NodeMailer 的问题

    我在 Heroku 上使用 Nodemailer 时遇到问题 非常感谢您的帮助 我的应用程序的先前版本曾经在 Heroku 上运行没有问题 当我回滚到该版本时 它仍然运行良好 在该应用程序的最新版本中 我没有对访问 Nodemailer 的
  • 在 iOS 中播放简单音效的最佳方法

    我发现许多有关在 iOS 中播放声音的相互矛盾的数据 每次用户触摸屏幕时仅播放简单的 ping 声音片段的推荐方法是什么 我用这个 头文件 import
  • 为什么“pip show”或“pip list”对我不起作用?

    蟒蛇的pip正在为我安装和更新软件包 但一些记录的命令似乎不受支持 至少在 OS 10 8 2 和 Python 2 7 2 上运行 1 2 1 时 当我尝试时 pip list or pip show
  • 升级时创建表

    我一直在努力解决这个问题 但我不知道我错过了什么 我有一个 Android 应用程序 我希望再添加 1 个表 但是我无法做到这一点 而且我也没有例外 不喜欢这些无声杀手 下面是我的 SQLiteHelper 类的代码 public clas
  • GWT 对单元格表进行排序,可能只是我没有看到的

    在过去的几个小时里 我一直在努力对 GWT CellTable 进行排序 这确实是一个愚蠢的问题 因为它已经在这里完成了http gwt google com samples Showcase Showcase html CwCellTab
  • Operator= 和 C++ 中未继承的函数?

    在我刚刚进行的测试之前 我认为在 C 中只有构造函数不被继承 但显然 任务operator 是不是太 这是什么原因呢 是否有任何解决方法来继承赋值运算符 是否也是如此operator operator 所有其他函数 除了构造函数 运算符 都