模板容器类被认为是“标量”?

时间:2011-12-03 18:45:08

标签: c++ templates

我有一个模板类,它是一个简单的向量,但是这段代码拒绝编译:

template<int t>
struct Vector {
 int pos[t];
 Vector(int other[t]) {
  for (int i = 0;i < t;++i) {
   pos[i] = other[i];
  }
 }
};

Vector<3> cake = {3,4,5};

这是错误:

Line 11: error: scalar object 'cake' requires one element in initializer
compilation terminated due to -Wfatal-errors.

为什么这不起作用?让它与此类似地工作的最简单方法是什么?

编辑:

这两项都不起作用:

Vector<3> cake({3,4,5});

是不应该调用带有签名Vector<3>(int[3])的构造函数?

1 个答案:

答案 0 :(得分:2)

在C ++ 03中,{}的初始化形式仅允许聚合(也包括POD)。

代码中的类模板不是POD,也不是聚合。在这里阅读我的答案,了解POD和Aggregate的定义。

一旦你知道了这些定义,你就会知道如何制作你的课程POD(如果你愿意的话)。

但是,在C ++ 11中,您可以使用{}初始化程序,但是您使用std::initializer_list<T>作为构造函数的参数类型。然后你可以使用{}甚至是非POD和Aggregate的类型!