从模板类继承时,我需要使用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
成员前加上前缀的原因已经回复HERE。所以我剩下的问题是:有没有办法避免所有this
es?例如,我在派生类中有一个使用大量基类成员的方法。代码看起来完全混乱了其中的所有this->
。有没有办法省略这些?
答案 0 :(得分:7)
要使其工作,您需要将非依赖名称foo
和bar
转换为从属名称。有三种方法可以做到这一点:
this
对其进行限定。这有一个缺点,你需要在使用名称的任何地方都这样做。 this
隐式是一个从属名称。X<T>::foo
和X<T>::bar
。这也需要在您使用它们的任何地方完成,并且如果它们变成虚拟方法,则还会破坏虚拟分派机制。using X<T>::foo;
和using X<T>::bar;
将相关名称带入非依赖名称空间。或者,您可以使用VC ++进行编译,而VC ++不关心依赖名称和非依赖名称之间的区别。