0

我有一个类似于以下的代码:

namespace mine
{
  template<class T>
  using _vector = std::vector<T, my_allocator<T>>;

  template<class T>
  class myvector : public _vector<T>{};
};

在大多数情况下,这可以作为我自己的 std::vector 替代品使用,但在使用普通 std::vector 列表初始化它时,它并不能很好地工作:

#include "myvector.h"

void foo(void)
{
  std::vector<int> vi = { 1, 2, 3 };
  mine::myvector<int> mvi = { { 1, 2, 3 } };
}

请注意,我使用了双花括号来编译它。那么,我在这里缺少什么?而且,更重要的是,我该怎么做才能像使用普通的 std::vector 一样初始化 mine::myvector?

4

1 回答 1

1

请注意,您的类没有定义或继承任何构造函数。所以有一刻我想知道你的代码是如何编译的。

您的代码使用聚合初始化。由于您没有任何字段只是公共继承,因此将聚合初始化的第一个参数传递给祖先。这就是为什么你需要双括号的原因。

解决它的一种方法是从基类继承构造函数。所以你的班级看起来像这样:

  template<class T>
  class myvector : public _vector<T>{
      using _vector<T>::_vector;
  };

https://godbolt.org/z/qH6s_x

IMO 更好的解决方案是不定义类,而是为类型定义别名:

  template<class T>
  using myvector = _vector<T>;

https://godbolt.org/z/Pt6sRQ

于 2020-06-29T12:32:22.993 回答