如何输入基类的成员模板?

时间:2015-07-08 10:15:18

标签: c++ templates c++11 allocator

我正在尝试将rebind_alloc的简短形式作为成员模板。

我的代码的最小部分如下:

template <class T, class Allocator = std::allocator<T> >
struct A
{
  using allocator_type = Allocator;

  template <class U>
  using rebind_alloc = typename std::allocator_traits<Allocator>::template rebind_alloc<U>;
};

template <class T, class Allocator = std::allocator<T> >
struct B : A<T, Allocator>
{
  using base = A<T>;
  using typename base::allocator_type;

  B(const allocator_type& alloc);
  // B(const base::allocator_type& alloc);

  template <class U>
  using typename base::rebind_alloc<U>; // ERROR ON THIS LINE
};

我编写每个基类的成员类型的原因是,在继承另一个类模板的类模板中,我不能直接使用成员类型,而是使用base::some_type形式。

allocator_type这样的单一类型是可以的,但是当我尝试对成员模板使用using语句时出现错误。

如何正确使用它?

2 个答案:

答案 0 :(得分:3)

您的代码中有大约十个错误。指出不同。 (缺少分号只计为一个。)

#include <memory>

template <class T, class Allocator = std::allocator<T> >
struct A
{
  using allocator_type = Allocator;

  template <class U>
  using rebind_alloc =
      typename std::allocator_traits<Allocator>::template rebind_alloc<U>;
};

template <class T, class Allocator = std::allocator<T> >
struct B : A<T, Allocator>
{
  using base = A<T, Allocator>;
  using allocator_type = typename base::allocator_type;

  B(const allocator_type& alloc);

  template <class U>
  using rebind_alloc = typename base::template rebind_alloc<U>;
};

答案 1 :(得分:1)

您可以声明一个新的别名模板,该模板使用基础模板:

template <class U>
  using rebind_alloc = typename base::rebind_alloc<U>;