【发布时间】:2016-02-10 10:53:43
【问题描述】:
为什么main下面的waitForEvent函数调用不明确?
#include <iostream>
struct Event1 { char c1[1]; };
struct Event2 { char c2[2]; };
template<class Event> struct EventSource
{
void waitForEvent(Event e) { std::cout << sizeof(e) << "\n"; };
};
typedef EventSource<Event1> Event1Source;
typedef EventSource<Event2> Event2Source;
struct Event12Source : public Event1Source, public Event2Source {};
int main()
{
Event12Source source;
source.waitForEvent(Event1());
source.waitForEvent(Event2());
return 0;
}
编译它我得到以下错误:
user@AHERLADUSERVM2:~/test/TemplateMultipleMethodInheritance$ g++ test.cpp test.cpp: In function ‘int main()’: test.cpp:19:12: error: request for member ‘waitForEvent’ is ambiguous
source.waitForEvent(Event1());
^ test.cpp:7:10: note: candidates are: void EventSource<Event>::waitForEvent(Event) [with Event = Event2]
void waitForEvent(Event e) { std::cout << sizeof(e) << "\n"; };
^ test.cpp:7:10: note: void EventSource<Event>::waitForEvent(Event) [with Event = Event1] test.cpp:20:12: error: request for member ‘waitForEvent’ is ambiguous
source.waitForEvent(Event2());
^ test.cpp:7:10: note: candidates are: void EventSource<Event>::waitForEvent(Event) [with Event = Event2]
void waitForEvent(Event e) { std::cout << sizeof(e) << "\n"; };
^ test.cpp:7:10: note: void EventSource<Event>::waitForEvent(Event) [with Event = Event1]
(为什么)这不是函数重载解析的简单案例吗?
谢谢, 达米安
【问题讨论】:
-
将
using Event1Source::waitForEvent; using Event2Source::waitForEvent;添加到派生类的主体中 -
谢谢@PiotrSkotnicki,现在它可以工作了。你能解释一下为什么需要这些吗?
-
@DamianBirchler 因为
Event2Source在继承顺序中较晚,并且与任何继承的类一样,它隐藏了在继承顺序中位于它之前的具有相同名称的函数。执行 Piotr 建议的操作会告诉编译器将所有其他重载从指定类中剔除到当前类中,从而取消自动隐藏。 -
请看这个[答案](stackoverflow.com/questions/1313063/…)
标签: c++