【问题标题】:using a fixed size array in another array initialize list在另一个数组初始化列表中使用固定大小的数组
【发布时间】:2017-03-23 16:47:10
【问题描述】:

我尝试执行以下操作:

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;
}

而且它起作用了(打印为“1, 2, 3, 4,”),所以我没有怀疑任何事情,直到我尝试用“专门化它”:

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

或与 :

一起使用
  Vector<double, 4> V2 (V);

编译器说:

错误:初始化时无法将 'const float*' 转换为 'float'

或与'double'相同。

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

谁能给我解释一下这里发生了什么?

【问题讨论】:

  • 你不能分配数组,你需要遍历复制它们的元素。
  • 不能写v1.v = v2.v;是同一个原因
  • 停止使用哑数组并使用std::array。它实际上与使用数组相同,没有您现在看到的所有陷阱,as this example shows

标签: c++ arrays templates initialization


【解决方案1】:

你不能用另一个数组初始化一个数组。

不,它也不适用于模板复制构造函数,以下代码 sn-p 只是给出相同的错误消息。

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;
}

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

而且我发现 V.v 总是衰减为指针,即使我尝试使用 reinterpret_cast 将其转换为 T (&amp;)[N]*reinterpret_cast&lt;T (*)[N]&gt;(V.v)

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


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

【讨论】:

  • 很好,谢谢,但我正在寻找解释为什么它确实可以与其他模板一起使用。另外,请注意,具有 reference members 的类是 non-copyable(我认为是未定义的行为),所以我永远不会这样做,尽管它有时很诱人。
  • @elad 不要担心引用,如果要使用隐式复制控制成员,可以将其删除。如果您想保留引用,只需定义您自己的复制控制成员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多