将基类模板的“this”类型转换为其派生类

2024-01-01

我的代码的简化版本如下所示:

template <class T>
struct Base
{
    void SayHello( T* aDerived )
    {
    }

    void SaySomething()
    {
        SayHello( this ); // This is where the error happens
    }
};

struct Derived : public Base< Derived >
{
};

int main(int argc, const char * argv[])
{
    Derived iDerived;
    iDerived.SaySomething();
}

并且它不会编译SayHello( this )与此错误消息一致:

Cannot initialize a parameter of type 'Derived *'
with an rvalue of type 'Base<Derived> *'

现在编译器抱怨这一点是有道理的,尽管在我看来有点愚蠢,如果我删除这一行,它不会抱怨:

iDerived.SaySomething();

无论如何,这个问题可以通过显式类型转换来解决,如下所示:

SayHello( (T*)this );

问题是我的实际代码最终会出现许多这样的类型转换,在我看来,只包含在其中是合理的Base允许它自动类型转换为其模板类的东西(T).

是不是operator=我追?有人可以提供代码示例来说明如何完成此操作吗?这个问题 https://stackoverflow.com/questions/5275175/using-the-type-conversion-operator建议我可以做类似的事情:

演员阵容总是介于this and T*.

operator T*()
{
    return (T*)this;
}

但错误仍然存​​在。


您可以添加一个返回的辅助函数this向下转换为派生类型

template <class T>
struct Base
{
    void SayHello( T* aDerived )
    {
    }

    void SaySomething()
    {
        SayHello( derived_this() );
    }

private:
    T* derived_this()
    {
        return static_cast<T*>(this);
    }

您可能还想要一个const超载:

    const T* derived_this() const
    {
        return static_cast<const T*>(this);
    }

You could添加隐式转换运算符,但我不推荐它:

    operator T*() { return static_cast<T*>(this); }

隐式转换削弱了类型系统,并且可能成为错误的来源,我认为显式函数如derived_this()更清晰、更安全。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将基类模板的“this”类型转换为其派生类 的相关文章

随机推荐

  • Javascript 文件无法访问 jstl

    我的 jstl 代码位于一个 javascript 文件中 该文件包含在我的 jsp 页面中 我遇到的问题是 当我在 jsp 页面内的脚本中编写 jstl 代码时 它工作正常 但是当我在单独的js文件中编写相同的代码时 jstl代码根本不起
  • 如何使用 jQuery 从 dom 中删除空元素?

    WordPress 文字编辑器吐出空内容 p 像这样的标签 p p nbsp p 我想针对所有 p with nbsp 并删除它们 我相信我必须使用contains and remove功能 但我不确定这段代码是否会删除 p p 标签仅 n
  • 从匿名内部类中突破方法

    我有一个方法 void someMethod String someString final String testAgainst for int i 0 i lt testAgainst length i if someString eq
  • 手机上无法播放背景视频?

    我制作了一个登陆页面 视频在表单的背景下播放 它在桌面上运行良好 但我使用 Chrome 在我的 Android 设备上检查 背景视频无法在其上播放 谁能帮我解决这个问题 这是我的链接fiddle http jsfiddle net Jam
  • 如何从 MySQL 数据库获取“印地语”文本(印度本地语言)?

    我已将印地语数据存储在 MySQL 数据库中 请参阅下图 现在我想获取该数据并显示在我的 JSP 页面上 但是当我尝试在 java 代码中获取数据时 我将文本转换为以下格式 UID Test upgrade 1 UID 159 1 UID
  • 物体的点状后边缘

    在我的 Android 应用程序中 我需要显示一个 3D 对象 这没问题 但前边缘应该是实心的 后边缘应该是虚线的 我需要有像图片上这样的东西 如何使用 OpenGL ES 1 或 2 实现它 我尝试过蒂姆的想法 使用深度缓冲区 它有效 但
  • 如何在 Angular2 中使用 httpparamserializer

    我正在尝试在 Angular2 中使用 httpparamserializer 我用谷歌搜索了很多 但这些例子仅适用于 Angular1 如下所示 如何注入 httpParamSerializer 以在 templateUrl 中使用 ht
  • 如何检查数据库中是否存在视图?

    如果数据库中存在某个视图 我需要执行一些 SQL 代码 我将如何检查视图是否存在 编辑 正在使用的 DBMS 是 Microsoft SQL Server 对于 SQL 服务器 IF EXISTS select FROM sys views
  • 屏蔽帐号以仅查看 DevExpress GridViewDataColumn 中的最后 4 位数字

    我需要添加 Mask DisplayFormatString 以仅查看 DevExpress GridViewDataColumn 中的最后 4 位数字 举例来说 如果真实帐号是123456789 然后它应该显示为 6789 你能帮我解决这
  • 在 Ubuntu 上安装 Node.js

    我正在尝试安装 Node jsUbuntu 12 10 https en wikipedia org wiki Ubuntu version history Ubuntu 12 10 28Quantal Quetzal 29 Quantal
  • 来自 rake 任务的 render_to_string

    我想使用 Rake 任务来缓存我的站点地图 以便请求sitemap xml不会花很长时间 这是我到目前为止所拥有的 posts Post all sitemap render to string template gt sitemap si
  • svn 存储库显示非常大的大小

    我的一位办公室开发人员将视频上传到 svn 存储库 几天后 他删除了这些视频 但 svn 存储库仍然显示非常大的尺寸 我怎样才能减小 svn 存储库的大小 您的问题已在 Apache Subversion 常见问题解答中得到解答 如何从存储
  • EF core 3.1 无法运行复杂的原始 SQL 查询

    以下查询在 EF core 2 上运行良好 但在 EF core 3 上会抛出错误 我什至可以在 EF core 2 中的此查询之后添加一些包含 现在我已经放弃了 query just to have an Id var id Guid N
  • jquery工具覆盖,如何在切换覆盖时保留蒙版

    我有一个简单的问题 有 2 个叠加层 一个叠加层由另一叠加层触发 并由另一叠加层触发 由于任一时间只能有一个叠加层处于活动状态 因此触发叠加层 2 的叠加层 1 会正确关闭 然而 它带有遮罩 因此覆盖层 2 出现时没有遮罩 如何在 2 个叠
  • CakePHP:身份验证组件未登录

    我现在正在学习 CakePHP 我遵循了他们给我的每一个方向 我得到了很好的结果 但是当涉及到 Auth 组件 以及他们在网站上教授的非常简单的身份验证 时 我就是无法管理去做吧 方法 this gt Auth gt login 不断返回
  • 为其他网站存储 cookie

    我有多个 ASP NET 站点 当用户登录到其中一个站点时 我想存储一个 cookie 来告诉我用户已经登录 当用户稍后访问我拥有的其他网站之一时 我想从该网站读取 cookie 据我所知 您既不能从其他网站读取 cookie 也不能向其他
  • 如何捕获请求上的错误,然后打开模式,然后在模式关闭时使用 RxJS 重试

    我想调用一个服务器 该服务器可以使用 Angular2 的 HTTP 类返回授权失败 401 请求的流程应该如下所示 用户使用 myService getSomething subscribe 向服务器发出请求 如果服务器返回 401 打开
  • 将 json 数据加载到 Google 大查询的架构

    我对我们正在做的项目有一个问题 我尝试将此 JSON 提取到 Google Big Query 但无法从 JSON 输入中获取 JSON 投票对象字段 我尝试了模式中的 记录 和 字符串 类型 votes funny 10 useful 1
  • 量角器、Jasmine超时问题

    我正在使用 Protractor 和 Jasmine 进行 e2e 测试 我们的应用程序是 Angular 的 我已经写给getPageTimeout 500000 allScriptsTimeout 600000 在配置文件中 添加def
  • 将基类模板的“this”类型转换为其派生类

    我的代码的简化版本如下所示 template