【发布时间】:2012-04-02 11:08:14
【问题描述】:
struct A {
void f(int x) {}
};
struct B {
template<typename T> void f(T x) {}
};
struct C : public A, public B {};
struct D {
void f(int x){}
template<typename T> void f(T x) {}
};
int main(int argc, char **argv) {
C c;
c.f<int>(3);
D d;
d.f<int>(3);
}
什么原因调用d.f就好了,但是c.f给了
error: request for member ‘f’ is ambiguous
error: candidates are: template<class T> void B::f(T)
error: void A::f(int)
【问题讨论】:
-
好问题。我想通常的重载解决规则不适用于
C(因为如果有匹配项,通常非模板优先于模板,因此D的行为)。 -
我想补充 OP 的问题:“无论 C++ 标准规则强制执行这种行为:该规则背后的基本原理是什么?”
-
@Vlad 我认为这种行为是非常明智的。在这里不引起错误可能会导致许多讨厌的错误。好问题。
-
@enobayram:那么,为什么
C::f没有错误? -
你确定编译器在第一次错误后没有停止吗?
标签: c++ templates class-hierarchy