Разное поведение компилятора при использовании псевдонима в качестве области видимости для получения родительского члена - PullRequest
4 голосов
/ 25 апреля 2020

Этот код прекрасно компилируется на Clang и Visual C ++, но не на G CC («Внутреннее» не было объявлено как ошибка):

#include <iostream>


template <class T>
struct Test {
    Test(T &t) : _t(t) {
    }

    void method() {
        std::cout << _t.Internal::_value << "\n";       // Doesn't work on GCC
        std::cout << _t.T::Internal::_value << "\n";    // Work on all compilers
    }

private:
    T &_t;
};

template <class T>
struct Base {
    T _value = 1;
};

template <class T>
struct Child : Base<int> {
    using Internal = Base<int>;

    int _value = 2;
};

int main(int argc, const char * argv[]) {
    Child<float> child;
    Test<Child<float>> test(child);

    test.method();

    return 0;
}

Какой из них правильный?

...