为什么类中派生的using语句不能在某些编译器中按预期工作?

rub*_*ict 7 c++ inheritance

如果从一个模板类派生,必须限定基类成员的用法有两种Base::this->.这是可以理解的,因为基类的成员是依赖于模板的名称.但是还有第三种选择 - 你可以使用using声明.我决定尝试一下,但有一些更复杂的层次结构:

struct Gadget
{
    void gadge()
    {
    }
};

struct Base1
{
    Gadget g;
};

template<typename T>
struct Base2 : Base1
{
};

template<typename T>
struct Widget : Base2<T>
{
    using Base1::g;

    void foo()
    {
        g.gadge();
    }
};
Run Code Online (Sandbox Code Playgroud)

但问题是g.gadge不会在某些编译器上编译.特别是,GCC 5.5.0和GCC HEAD(8.0.1)将发出以下错误消息:

prog.cc: In member function 'void Widget<T>::foo()':
prog.cc:27:11: error: 'struct Base1' has no member named 'gadge'
         g.gadge();
           ^~~~~
Run Code Online (Sandbox Code Playgroud)

另一方面,它使用GCC 6.1.0,GCC 7.2.0以及我尝试过的所有Clang版本进行编译和工作.哪个编译器是对的?