Неоднозначность в полностью определенной статической переменной-члене

В этом примере кода есть два предложения, показывающие одну и ту же статическую переменную. Первый не дает двусмысленности, а второй дает, почему?

#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;

Код на coliru


person Peregring-lk    schedule 25.05.2016    source источник
comment
Я знаю, что видел что-то подобное месяц назад или около того. Я считаю, что он не знает, какой родитель использовать в случае v. Пытаюсь найти.   -  person NathanOliver    schedule 25.05.2016
comment
@barakmanos Точно, я исследую случай, когда мне не нужно виртуальное наследование.   -  person Peregring-lk    schedule 25.05.2016
comment
Это успешно компилируется с clang.   -  person interjay    schedule 25.05.2016
comment
Вы уверены, что там не struct E : public C?   -  person barak manos    schedule 25.05.2016
comment
@Peregring-lk, coliru.stacked-crooked.com/a/9d43d2604247b3c0 примерно В 20 раз легче читать и понимать. Большая часть вашего примера — это неуместный шум, который просто затеняет вещи.   -  person Jonathan Wakely    schedule 25.05.2016
comment
EDG тоже принимает это. Пожалуйста, сообщите об ошибке GCC (если вы не можете найти существующую) с минимальным примером (не вашим подробным оригиналом). Спасибо.   -  person Jonathan Wakely    schedule 25.05.2016
comment
@JonathanWakely, я думаю, ваш разъясненный пример достоин ответа.   -  person SergeyA    schedule 25.05.2016
comment
Это не ответ, это просто MCVE, который должен был быть в исходном вопросе.   -  person Jonathan Wakely    schedule 25.05.2016


Ответы (1)


Это явно ошибка в GCC, поскольку сопровождающий GCC рекомендует вам сообщить об этом. Однако, пока это не будет исправлено, вы можете использовать неприятный обходной путь, подобный этому:

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

Преимущество заключается в том, что это поможет устранить неоднозначность, если в (сложном) сценарии есть переменные с одинаковыми именами в одном из базовых классов.

person uh oh somebody needs a pupper    schedule 25.05.2016