这可以在 Visual C++ 2015 Update 3 RC 上正常编译和运行:
class A
{
template <class T> void f() {}
};
class B : A {};
class C : A {};
class D : B, C {};
int main()
{
D d;
d.f<int>();
}
这段代码有两个问题:
-
f()
是私有(private)的,所以d.f<int>()
应该无法编译。 -
f()
是模棱两可的,因为它可能是B::f()
或C::f()
.
但是,/Wall
没有诊断功能和 B::f()
叫做。倒序D
继承自 gets C::f()
调用,所以我猜它只是使用列表中的第一个基类。
g++ 和 clang 都正确。我是否遗漏了什么或者这是 Visual C++ 中的错误?
最佳答案
这是 Visual C++ 的错误。我可以在 2015 年和 2012 年重现它,但不能在 2005 年重现。我打开了一个 bug report on Connect .我唯一的解决方法是将函数重命名为一些不寻常的名称,这样就不会被意外调用。
关于c++ - 没有对多个基类中的模板化成员函数进行访问或歧义检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37767080/