std :: array错误:没有名为' assign'的成员

时间:2014-06-17 05:46:16

标签: c++ c++11 assign g++4.8 stdarray

在以下代码中,编译器抱怨为:struct std::array<double,5ul> has no member named 'assign'Here,似乎有可能。为什么会这样? (编译:​​g ++ 4.8.2)

#include <array>

int main()
{
    std::array<double,5> arr;
    arr.assign(4.); // error: has no member named 'assign'
    return 0;
}

4 个答案:

答案 0 :(得分:14)

array::assign()是Visual Studio扩展。您正在使用g ++进行编译。点击standard g++ array

答案 1 :(得分:9)

如前所述,assign只是std::array成员。

现在有趣的问题变成为什么?毕竟,其他容器都有assign成员方法!

我会注意到,与其他容器不同,std::array具有固定大小。如果使用std::vector<T>::assign(它等效近似),则适当调整向量的大小以匹配所分配的序列的大小;但是,使用数组是不可能的:

  • 如果分配的序列比数组短,你会怎么做?
  • 如果分配的序列长于数组,您会怎么做?

这是违反直觉的,因为其他容器不会出现问题,因为它们的尺寸只是在运行中进行调整。

出于类似原因,std::array没有:reservecapacityclearinsertemplace,{{1 },erase / push(和变体)或pop。所有这些都假设一个容器的大小可能会有所不同。

答案 2 :(得分:5)

这很简单,因为你可以看到here std数组没有assign成员函数。但是,您应该可以使用名为fill的成员函数。

答案 3 :(得分:2)

assign方法,它不是std::array的成员。成员fill执行assign在TR1中所做的工作。

assign最初是std::tr1::array的一部分(来自the TR1),并且被改为fill,大约是C ++ 0x(现在是C ++ 11){{ 3}}(2008)。

这不是微软的扩展,我想他们可能已经维护了这种方法,以便与生产中的tr1实现兼容并支持它们(方法实现完全相同)。