在另一个数组初始化列表中使用固定大小的数组

时间:2017-03-23 16:47:10

标签: c++ arrays templates initialization

我尝试执行以下操作:

template <typename T, int N>
struct Vector {
  T v[N];
  template<typename... Args> Vector(Args... args) : v { args... } {}
  template<typename S> Vector(Vector<S, N> const & V) : v {V.v} {}
};
int main() {
  Vector<float, 4> V (1.0f, 2.0f, 3.0f, 4.0f);
  Vector<float, 4> V2 (V);
  for (auto f : V2.v) { cout << f << ", "; } cout << endl;
  return 0;
}

它有效(印刷&#34; 1,2,3,4和#34;),所以我没有怀疑任何事情,直到我试图&#34;专门化它&#34;用:

  Vector(Vector const & V) : v {V.v} {}

或与之一起使用:

  Vector<double, 4> V2 (V);

编译说:

  

错误:无法转换&#39; const float *&#39;到&#39;漂浮&#39;在初始化

或与&#39; double&#39;相同。

之后我尝试了简单的数组,它失败了同样的错误,但是有足够的模板可以工作..

有人可以向我解释这里发生了什么吗?

1 个答案:

答案 0 :(得分:1)

您无法使用其他阵列初始化数组。

不,它也不能使用模板拷贝构造函数,以下代码片段只是给出了相同的错误消息。

template <class T, int N>
struct Vector2 {
  T vv[N];
};

template <typename T, int N>
struct Vector {
  T v[N];
  template<typename T1>
  Vector(const Vector2<T1, N> & V) : v{V.vv} {}
};

int main() {
  Vector2<float, 4> V2;
  Vector<float, 4> V1(V2);

  return 0;
}

您的代码段工作原因是因为编译器使用了隐式声明的复制构造函数。如果你明确地将它声明为已删除或私有成员,你会发现编译器甚至没有尝试实例化模板复制构造函数,我不知道为什么。

我发现V.v总是衰减到指针,即使我尝试使用reinterpret_cast将其强制转换为T (&)[N]*reinterpret_cast<T (*)[N]>(V.v)

所以......我试着找出答案,但这只会导致更多问题......

解决方法可以将数组包装到类中。