从模板化基类派生的正确方法是什么?

时间:2017-04-16 05:23:46

标签: c++ templates inheritance

我使用的是Clang ++ 3.9.1。

我试图构建一个类层次结构,其中许多基类都是模板化的。这些类只在其派生类的定义中实例化。虽然派生类是模板化的,但似乎在层次结构中存在多于一代的模板类并且隐藏了#34;这些基类的成员名称。

#include <iostream>

struct MostBase {
  char r;
  MostBase() : r('r') {}
};

template < typename S >
struct Base : public MostBase {
  S s;
  Base (S s_) : MostBase(),s(s_) {}
};

template < typename T >
struct Derived : public Base<T>
{
  T t;
  Derived (char ch ) : Base<T>(ch) { t = 't'; }
  void print() {
    std::cout << r << " " << s << " " << t << std::endl;
  }
};

int main (int argc, char* argv[])
{
  Derived<char> x ('s');
  d.print();   // should be: "r s t\n"
}

我收到的错误消息是:

template-base.cpp:21:18: error: use of undeclared identifier 'r'
    std::cout << r << " " << s << " " << t << std::endl;
                 ^
template-base.cpp:21:30: error: use of undeclared identifier 's'
    std::cout << r << " " << s << " " << t << std::endl;
                             ^

对这些模板类进行子类化以避免这种隐藏的正确方法是什么?

我很想认为这是一个错误,因为如果层次结构中只有一个模板化的类向上,则名称不会被隐藏,一切正常。

我必须使用 using Base::s 中的 using MoreBase::r Derived 语句我想使用的每个成员变量?

这似乎适用于这个小例子,但实际应用程序中的成员变量要多得多。

0 个答案:

没有答案