c++ - 没有对多个基类中的模板化成员函数进行访问或歧义检查

标签 c++ visual-c++ private multiple-inheritance ambiguous

这可以在 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()是私有(private)的,所以 d.f<int>()应该无法编译。
  2. 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/

相关文章:

由于 "Due to its protection level",C# 编译失败

com - 无法在 VC++ 2008 中的 COM 接口(interface)方法中输出/检索参数

scala - 我可以在 Scala 中定义 “method-private” 字段吗?

java - Java 中的私有(private)抽象类

c++ - 使用模板漂亮地打印嵌套数组

c++ - 模板推导和 decltype(T) 如何作用于引用?

c++ - 有没有办法用 C++ 模拟 Windows 输入?

c++ - MFC - 显示模态对话框时主窗口变暗

c++ - SSE 数据类型和原语

java - 子类会继承私有(private)字段吗?