c++ - 完全限定的静态成员变量中的歧义

标签 c++ multiple-inheritance fully-qualified-naming

在这个示例代码中,有两个句子显示同一个静态变量。第一个没有歧义,但第二个有,为什么?

#include <iostream>

using namespace std;

struct A { static const char a = 'a'; };
struct B : public A { };
struct C : public A { };
struct G : public B, public C { };

int main()
{
    G v;

    cout << G::B::A::a << endl;
    cout << v.B::A::a << endl;
}

GCC 错误(根据一些评论,clang 没有歧义):

main.cpp:15:18: error: 'A' is an ambiguous base of 'G'
  cout << v.B::A::a << endl;

Code on coliru

最佳答案

这显然是 GCC 中的一个错误,作为 GCC maintainer建议你举报。然而,在它被修复之前,您可以使用这样一个令人讨厌的解决方法:

std::cout << static_cast<B &>(v).A::a;

这样做的好处是,如果在(复杂的)场景中某个基类中存在同名变量,这将有助于消除歧义。

关于c++ - 完全限定的静态成员变量中的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37445130/

相关文章:

class - 如何让继承从父类到子类python34

ruby-on-rails - Mongoid store_in 产生随机结果

java - 从 Java.lang.String 确定完全限定的类名

C++:使用带有排序函数的完全限定名称 - 行为不一致

matlab - 如何正确命名和组织 MATLAB 文件类?

c++ - 为什么 QWebView 在通过 setHtml 加载时不显示任何图像?

c++ - 返回从另一个成员函数调用的 const 引用的函数

c++ - 尝试使用 IViewObject::Draw() 将 Web 浏览器控件渲染到 HDC 中在 IE8 中失败,但在 IE11 中成功

C++根据auto的具体类型编译代码

c# - 描述接口(interface)之间的关系