c++ - 有没有办法避免在模板基类成员前面加上 `this` 前缀?

标签 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 .所以我剩下的问题是:有没有办法避免所有的 thises?例如,我在派生类中有一个方法使用了很多基类成员。代码看起来完全困惑,其中包含所有 this->。有没有办法省略这些?

最佳答案

要完成这项工作,您需要将非依赖名称转为 foobar成依赖名称。可以通过三种方式做到这一点:

  • 使用 this 对他们进行资格认证,就像你所做的那样。这样做的缺点是您需要在使用名称的任何地方执行此操作。 this隐含地是从属名称。
  • 用基类名限定它们,如X<T>::fooX<T>::bar .这也需要在您使用它们的任何地方完成,并且如果它们最终是虚拟方法,还会破坏虚拟分派(dispatch)机制。
  • 通过 using X<T>::foo; 将依赖名称放入非依赖 namespace 和 using X<T>::bar; .

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

关于c++ - 有没有办法避免在模板基类成员前面加上 `this` 前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25402716/

相关文章:

c++ - 检查完整类型

asp.net-mvc - 在 ASP.NET MVC 2 中模板化 Html.DisplayFor()

c++ - struct 中的 vector 指针无法转换 main 中的 vector ,这是怎么回事?

c++ - 在编译时更改字符串宏

c++ - 忽略 C++ 中模板类的重复显式实例化

c++ - 我不能再将 char[M][N] 类型分配给 gcc 4.9 上的 std::vector

C++ 相当于 .ToString()

c++ - 试图调用模板类的友元函数

c# - c++:使用类型作为 map /字典的键?

c++ - 用于 C++ 的整数区间容器,例如 RangeSet