【问题标题】:Casting inherited template class to parent class将继承的模板类转换为父类
【发布时间】:2021-09-26 22:02:00
【问题描述】:

编辑:添加了演员表问题。


我有一个小 C++ 问题,希望您能帮我解决。 我正在使用一个提供类GenericHandler 的库。我必须从那个类继承,覆盖东西,然后将我的处理程序注册到库中才能运行魔法。由于我需要在某些区域重叠的多个处理程序,我尝试使用如下模板

template <typename T>
class MyGenericHandler : public GenericHandler
{
// everything used for all handlers goes here
};

class MyIntHandler : public MyGenericHandler<int>
{
};

class MyFloatHandler : public MyGenericHandler<float>
{
};

// in main
std::shared_ptr<MyIntHandler> handler = std::make_shared<MyIntHandler>();
library::HandlerQueue.register(handler);
// error-message: "no viable conversion from shared_ptr<MyIntHandler> to shared_ptr<GenericHandler>.
// Same error if I try it like this:
std::shared_ptr<GenericHandler> handler = std::make_shared<MyIntHandler>();

但是,我现在不能再将MyIntHandler 投射到提供GenericHandler 的库中。 它之前确实有效,当时我有MyIntHandler : public GenericHandler,所以我猜这个模板不知何故破坏了东西。 有没有办法让它仍然工作?我是否需要手动投射,如果需要,我该怎么做?

【问题讨论】:

  • 你“不能投”是什么意思?请提供重现问题所需的最少代码和您收到的错误消息。
  • GenericHandler在哪里?
  • 查看编辑。 GenericHandler 是由我使用的库提供的,所以它不是由我实现的。我试图让这个例子保持简单,如果你需要一个功能齐全、运行的例子,我也可以为你把它放在一起。 :) @DanielLangr
  • 我无法重现错误:godbolt.org/z/n4Mhn9T8z

标签: c++ templates inheritance


【解决方案1】:

似乎使用std::dynamic_pointer_cast 修复了它;仍然不确定为什么@prehistoricpenguin 无法重现它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多