我不确定模板类型推导是否会在这里引起争论。但是让我解释一下。
我有一个模板 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
在事件类中定义。
- 为什么这个调用不明确:
hellRaiserObject->Trigger(MouseMoveEvent(11, -4));
假设对象来自EventProducer<MouseMoveEvent>
和EventProducer<MouseButtonEvent>
? - 我可以做些什么来帮助编译器决定调用哪个,而无需明确指定基数吗?
- 同样的情况也发生在这个电话上:
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/