如果从一个模板类派生,必须限定基类成员的用法有两种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版本进行编译和工作.哪个编译器是对的?