有没有办法绕过模板基类成员前缀`this`?

时间:2014-08-20 10:44:50

标签: c++ templates c++11

从模板类继承时,我需要使用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->。有没有办法省略这些?

1 个答案:

答案 0 :(得分:7)

要使其工作,您需要将非依赖名称foobar转换为从属名称。有三种方法可以做到这一点:

  • 正如您所做的那样,使用this对其进行限定。这有一个缺点,你需要在使用名称的任何地方都这样做。 this隐式是一个从属名称。
  • 使用基类名称对其进行限定,X<T>::fooX<T>::bar。这也需要在您使用它们的任何地方完成,并且如果它们变成虚拟方法,则还会破坏虚拟分派机制。
  • 通过using X<T>::foo;using X<T>::bar;将相关名称带入非依赖名称空间。

或者,您可以使用VC ++进行编译,而VC ++不关心依赖名称和非依赖名称之间的区别。