为什么在一个类中使用的声明不是在某些编译器中按预期工作的?

时间:2018-04-19 15:42:21

标签: 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();
    }
};

但问题是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();
           ^~~~~

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

0 个答案:

没有答案