【问题标题】:Base template inheritance members, reduce typing needed基本模板继承成员,减少所需的类型
【发布时间】:2015-01-22 14:39:26
【问题描述】:

我有一个社区已经知道的问题(可以找到最完整的答案之一here),但我想知道是否有办法让编译器了解您想要访问 base无需使用typedefthis 的模板成员如下:

#include <iostream>

template<typename T>
struct Base{
  T a;
  T a2;
};

template<typename T1, typename T2>
struct Derived : Base<T2>{
  T2 b;

  void member_fnc();
};

template<typename T1, typename T2>
void Derived<T1,T2>::member_fnc(){
  typedef Base<T2> base;
  std::cout << "a = " << base::a << std::endl;    // or this->a;
  std::cout << "a2 = " << base::a2 << std::endl;  // or this->a2;                     
  std::cout << "b = " << b << std::endl;
}

int main(){

  Derived<int,double> der1;
  der1.a = 1;
  der1.a2 = 2;
  der1.b = 1.1;
  der1.member_fnc();

}

我有这种感觉,应该有一种方法可以说编译器要访问基本模板 Base&lt;T2&gt;,而不必为要访问的每个成员键入它或包含 using,因为您可以使用 @ 取消嵌套命名空间987654327@关键字,但我目前找不到。有可能吗?

【问题讨论】:

    标签: c++ templates inheritance


    【解决方案1】:

    为什么不:

    template<typename T1, typename T2>
    struct Derived : Base<T2>{
      typedef Base<T2> base;
      using base::a;
      using base::a2;
    
      T2 b;
      void member_fnc();
    };
    
    template<typename T1, typename T2>
    void Derived<T1,T2>::member_fnc(){
      std::cout << "a = " << a << std::endl;    // or this->a;
      std::cout << "a2 = " << a2 << std::endl;  // or this->a2;                     
      std::cout << "b = " << b << std::endl;
    }
    

    【讨论】:

    • 嗯,这只是将 typedef 移动到类范围。但我不想像我们在非模板基类上那样写base::this...我想我要求太多了,不是吗?
    • @Werner 我改变了答案。您仍然需要在 using 语句中添加一点 base::
    • 好吧……看来这是我们能得到的最好x)
    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多