【问题标题】:Overloading when inheriting from two differently-templated copies of the same class从同一类的两个不同模板副本继承时重载
【发布时间】:2018-03-23 18:50:01
【问题描述】:

我正在为一个游戏编写一个输入处理系统,我希望它可以扩展到任意事件类型。我想设计一个类似接口的规范,允许我强制要求某些对象处理某些事件;例如通过class Player : public EventHandler<KeyboardEvent> 之类的东西。我对这种东西的建议设计如下。

template <class T>
class EventHandler {
public:
    void handleEvent(T event) { doHandleEvent(event); };
private:
    virtual void doHandleEvent(T event) {};
};

class InputHandler : public EventHandler<Action>, public EventHandler<CursorEvent> {};

但是,在我调用InputHandler::handle() 时,上面会产生以下错误。看来handleEvent() 的两个模板版本的EventHandler 被视为相同的功能。我的印象是,由于handleEvent 的两个版本具有不同的参数类型,结果应该就像InputHandler 有一个具有两种可能参数类型的重载函数。

为什么 C++ 不允许这样做,还有哪些更好的替代方法可以替代我正在尝试做的事情?我怀疑以上可能不是好的做法。

/Users/smichaels/Projects/danmaku/src/SDL/Input.cpp:35:34: error: member 'handleEvent' found in multiple base classes
      of different types
                if (act) handler.handleEvent(act.get());
                                 ^
/Users/smichaels/Projects/danmaku/src/SDL/../Input/InputHandler.hpp:15:14: note: member found by ambiguous name lookup
        void handleEvent(T event) { doHandleEvent(event); };
             ^
/Users/smichaels/Projects/danmaku/src/SDL/../Input/InputHandler.hpp:15:14: note: member found by ambiguous name lookup

【问题讨论】:

    标签: c++ templates overloading virtual


    【解决方案1】:
    class InputHandler :
      public EventHandler<Action>,
      public EventHandler<CursorEvent>
    {
    public:
      using EventHandler<Action>::handleEvent;
      using EventHandler<CursorEvent>::handleEvent;
    };
    

    中,您可以改为:

    template<class...Bases>
    struct ManyHandler:Bases...{
      using Bases::handleEvent...;
    };
    template<class...Events>
    using EventsHandler=ManyHandler< EvendHandler<Events>...>;
    

    然后

    class InputHandler : public EventsHandler<Actions, CursorEvent >{};
    

    如果你也有

    class OutputHandler : public EventsHandler< Messages, Sounds >{};
    

    我们可以写

    class IoHandler : public ManyHandler< InputHandler, OutputHandler > {};
    

    【讨论】:

    • 非常感谢,这正是我要找的!
    猜你喜欢
    • 2013-06-05
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多