在多个基 类 中发现的模板化成员函数没有访问权限或歧义检查

No access or ambiguity check on templated member function found in multiple base classes

这在 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>();
}

这段代码有两个问题:

  1. f() 是私有的,因此 d.f<int>() 应该无法编译。
  2. f() 是不明确的,因为它可能是 B::f()C::f().

但是,/Wall 没有诊断,B::f() 被调用。颠倒顺序 D 继承自 gets C::f() 调用,所以我猜它只是使用列表中的第一个基数 class。

g++ 和 clang 都正确。我是否遗漏了什么或者这是 Visual C++ 中的错误?

这是 Visual C++ 的错误。我可以用 2015 和 2012 重现它,但不能在 2005 上重现。我打开了一个 bug report on Connect。我唯一的解决方法是将函数重命名为一些不寻常的名称,这样就不会被意外调用。