zad*_*gus 2 c++ templates variadic-templates c++11
这段代码的Objectif是创建一个包围diffent模板设计(一个实现与总是相同的处理程序工作),但有了这个尝试我有以下错误"错误:请求成员'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_;
};
Run Code Online (Sandbox Code Playgroud)
deferend模板的包装器(将添加一些方法来处理不同类型的事件
template<typename... EventHandler>
struct _EventsHandler : EventHandler... {
};
Run Code Online (Sandbox Code Playgroud)
// usage sample:我们创建将实例化事件管理器的类型
using EventHandlerType = EventsHandler<EventHandler<int>,EventHandler<float>,EventHandler<char>>;
int main(void) {
EventHandlerType test;
int msp = 1;
test.pushEvent(msp);
}
Run Code Online (Sandbox Code Playgroud)
我不明白模糊错误,因为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]
Run Code Online (Sandbox Code Playgroud)
我知道这样的解决方案可以采用不同的方式处理,但我想了解这个错误的原因,所以如果答案是"还有另一种方法可以解决您的问题",请不要将此问题标记为"已经回答"
在重载解析之前,执行名称查找,它具有自己的一组规则.它必须找到一个明确的名称,在你的情况下没有一个.
您可以使用以下代码(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;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |