当从模板类继承时,我需要在派生类中访问的所有基类成员前面加上this
:
template<typename T>
struct X{
int foo;
void bar();
};
template<typename T>
struct Y : public X<T> {
void blub(){
foo++; // Does not work
this->foo++; // Fine
bar(); // Does not work
this->bar(); // Fine
}
}
正如我所暗示的那样,为什么必须用this
作为成员前缀的原因已经在这里得到了回答。所以我剩下的问题是:有没有办法避免所有的this
?例如,我在派生类中有一个方法,它使用了很多基类成员。代码看起来完全混乱的所有this->
在其中。有没有办法省略这些?
要做到这一点,您需要将非依赖名称foo
和bar
转换为依赖名称。有三种方法可以做到这一点:
- 用
this
限定它们,就像你所做的那样。这样做的缺点是,您需要在使用这些名称的任何地方执行此操作。this
是隐式的依赖名称。 - 用基类名限定它们,如
X<T>::foo
和X<T>::bar
。这也需要在使用它们的任何地方完成,并且如果它们被证明是虚拟方法,则会额外破坏虚拟分派机制。 - 通过
using X<T>::foo;
和using X<T>::bar;
将依赖名称引入非依赖名称空间
或者,你可以用vc++编译,vc++不关心依赖和非依赖名称的区别