c++ 11使用可变模板多重继承
ambiguous error : C++11 use variadic template multiple inheritance
这段代码的目标是创建一个围绕不同模板设计的包装(始终具有相同处理程序工作的实现),但是有了这个尝试,我有以下错误"错误:请求成员'pushEvent'是模棱两可的"我不明白(消息底部的错误细节)
template<typename T>
struct EventHandler {
EventHandler() {}
inline void pushEvent(T & msg) {
printf("pushEvent %s", typeid(T).name());
q_.push(msg);
}
protected:
std::queue<T> q_;
};
延迟模板的包装器(将添加一些方法来处理不同类型的事件)
template<typename... EventHandler>
struct _EventsHandler : EventHandler... {
};
//使用示例:我们创建将实例化事件管理器的类型
using EventHandlerType = EventsHandler<EventHandler<int>,EventHandler<float>,EventHandler<char>>;
int main(void) {
EventHandlerType test;
int msp = 1;
test.pushEvent(msp);
}
我不理解歧义错误,因为msp类型是int,应该给出信息来解决歧义?
error: request for member 'pushEvent' is ambiguous
test.pushEvent(msp);
^
note: candidates are: void _EventHandler<T>::pushEvent(T&) [with T = char]
inline void pushEvent(T & msg) {
^
note: void _EventHandler<T>::pushEvent(T&) [with T = float]
note: void _EventHandler<T>::pushEvent(T&) [with T = int]
note: void _EventHandler<T>::pushEvent(T&) [with T = char]
我知道这样的解决方案可以以不同的方式处理,但我想了解这个错误的原因,所以如果答案是"有另一种方法来解决你的问题",请不要将这个问题标记为"已经回答"
在重载解析之前,执行名称查找,它有自己的一组规则。它必须找到一个明确的名称,而你的情况没有。
您可以使用以下方式(https://ideone.com/ChvQ4q)
template<typename... Ts>
struct _EventsHandler;
template<typename T>
struct _EventsHandler<T> : T
{
using T::pushEvent;
};
template<typename T, typename... Ts>
struct _EventsHandler<T, Ts...> : T, _EventsHandler<Ts...>
{
using T::pushEvent;
using _EventsHandler<Ts...>::pushEvent;
};
这行得通:
#include <typeinfo>
#include <queue>
#include <cstdio>
template<typename T>
struct EventHandler {
EventHandler() {}
void pushEvent(T & msg) {
printf("pushEvent %s", typeid(T).name());
q_.push(msg);
}
protected:
std::queue<T> q_;
};
template<typename... EventHandler>
struct _EventsHandler : EventHandler... {
template <typename T>
void pushEvent(T & msg) {
// Choose appropriate superclass
::EventHandler<T>::pushEvent(msg);
}
};
using EventHandlerType = _EventsHandler<EventHandler<int>,EventHandler<float>,EventHandler<char>>;
int main(int, char**) {
EventHandlerType test;
int msp = 1;
test.pushEvent(msp);
}
我缺乏足够的模板巫术来解释这一点,但毫无疑问,有人能够(并且可能与标准中的确切段落相匹配)
相关文章:
- 关于C++中具有多重继承"this"指针的说明
- C++中模板化异常类的多重继承
- 虚拟继承中是否存在多重继承?
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承相同的方法名,没有歧义
- 使用enable_if解决多重继承歧义
- 多重继承导致虚假的模糊虚拟函数过载
- 多重继承和访问不明确的元素
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 多重继承中的派生类的行为类似于聚合
- 为什么我的 Hippomock 期望在使用多重继承时失败
- 带有此指针的模板类多重继承构造函数不起作用?
- 使用多重继承时出现编译错误
- 增强多重继承的序列化
- 多重继承:跳过'virtual'关键字并拒绝菱形层次结构的使用?
- 仅函数的多重继承 - 没有虚拟和 CRTP
- C++多重继承和鸭子类型
- C++两次从文件保存对象读取多重继承
- 从多重继承中的派生类函数调用适当的父类函数
- C++具有多重继承的构造函数重载解析