c++ - 基础解析/模板类型推导

标签 c++ templates c++11 template-meta-programming

我不确定模板类型推导是否会在这里引起争论。但是让我解释一下。

我有一个模板 class EventProducer引发事件的对象从中派生,对于每种事件类型一次,这样我就可以拥有这样的东西:class HellRaiser: public EventProducer<MouseMoveEvent>, public EventProducer<MouseButtonEvent> .这似乎工作得很好,除了你必须限定 EventProducer通过派生类的对象调用时使用基类型调用。但是编译器不应该自动推导基数 EventProducer

这是定义:

template <typename TEvent>
class EventProducer
{
public:
    typedef function<typename TEvent::HandlerSignature> HandlerFunction;

    //  Methods.
    connection Subscribe(const HandlerFunction& callback);
    void Trigger(TEvent& event);

protected:
    // ...
};

在哪里TEvent::HandlerSignature在事件类中定义。

  1. 为什么这个调用不明确:hellRaiserObject->Trigger(MouseMoveEvent(11, -4));假设对象来自 EventProducer<MouseMoveEvent>EventProducer<MouseButtonEvent>
  2. 我可以做些什么来帮助编译器决定调用哪个,而无需明确指定基数吗?
  3. 同样的情况也发生在这个电话上:hellRaiserObject->Subscribe(mouseCallback); .我知道在这里推断类型可能有点困难,但是 mouseCallback有一个可以与模板特化进行比较的特定签名,我认为它只适合其中一个。

以防万一,事件定义如下:class MouseMoveEvent: public Event<MouseMoveEvent> , 其中基本模板是

template <typename TEventArgs>
class Event
{
public:
    typedef TEventArgs EventArgs;
    typedef void HandlerSignature(TEventArgs&);

    // ...
};

非常感谢帮助。

最佳答案

来自多个基类的名称查找必须是明确的

10.2 成员名称查找[class.member.lookup]

1 Member name lookup determines the meaning of a name (id-expression) in a class scope (3.3.7). Name lookup can result in an ambiguity, in which case the program is ill-formed.

标准的该部分中有大量关于如何合并来自各种基类的名称的技术细节,但最终,如果出现歧义,则程序格式错误。因此,您需要限定您的姓名才能解决此问题。

请注意,各种函数的最佳匹配签名会在重载解析期间发挥作用,但这只会在成功且明确的名称查找之后发生。

关于c++ - 基础解析/模板类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19947927/

相关文章:

c++ - 从 body 提取掩码计算边界框

c++ - 空指针作为 C++ 中的模板参数

c++ - 使用 winapi 或 mfc 从 .NET 应用程序列表控件中获取项目名称

c++ - 如何为返回异步结果的函数指定函数签名?

c++ - 构造函数中对 (class)(type) 的调用不匹配

c++ - 自动销毁静态对象

c++ - 函数模板参数的类型推导

c++ - 为什么 g++ 与 -O3 段错误与以下 LLVM 库代码

c++ - 具有自定义指针类型 : *get() and operator*() give different output 的 unique_ptr

c++ - 为什么 clang++ 会对内联的 enable_if 发出警告,然后无法链接?