在多个基 类 中发现的模板化成员函数没有访问权限或歧义检查
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>();
}
这段代码有两个问题:
f()
是私有的,因此 d.f<int>()
应该无法编译。
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。我唯一的解决方法是将函数重命名为一些不寻常的名称,这样就不会被意外调用。
这在 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()
是私有的,因此d.f<int>()
应该无法编译。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。我唯一的解决方法是将函数重命名为一些不寻常的名称,这样就不会被意外调用。